General Setup


Create a new analysis directory...
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE
[1] "/Users/swvanderlaan/git/CirculatoryHealth/AE_20211201_YAW_SWVANDERLAAN_HDAC9"
 [1] "_archived"                                     "1. AEDB.CEA.baseline.nb.html"                  "1. AEDB.CEA.baseline.Rmd"                     
 [4] "2. SNP_analyses.Rmd"                           "20220319.HDAC9.AEDB.CEA.baseline.RData"        "20220319.HDAC9.bulkRNAseq.main_analysis.RData"
 [7] "20220319.HDAC9.bulkRNAseq.preparation.RData"   "3.1 bulkRNAseq.preparation.nb.html"            "3.1 bulkRNAseq.preparation.Rmd"               
[10] "3.2 bulkRNAseq.main_analysis.nb.html"          "3.2 bulkRNAseq.main_analysis.Rmd"              "3.3 bulkRNAseq.additional_figures.Rmd"        
[13] "4. scRNAseq.Rmd"                               "AE_20211201_YAW_SWVANDERLAAN_HDAC9.Rproj"      "AnalysisPlan"                                 
[16] "HDAC9"                                         "images"                                        "LICENSE"                                      
[19] "README.html"                                   "README.md"                                     "references.bib"                               
[22] "renv"                                          "renv.lock"                                     "scripts"                                      
[25] "SNP"                                           "targets"                                      
source(paste0(PROJECT_loc, "/scripts/functions.R"))
ggplot2::theme_set(ggplot2::theme_minimal())
pander::panderOptions("table.split.table", Inf)
install.packages.auto("pander")
install.packages.auto("readr")
install.packages.auto("optparse")
install.packages.auto("tools")
install.packages.auto("dplyr")
install.packages.auto("tidyr")
install.packages.auto("naniar")

# To get 'data.table' with 'fwrite' to be able to directly write gzipped-files
# Ref: https://stackoverflow.com/questions/42788401/is-possible-to-use-fwrite-from-data-table-with-gzfile
# install.packages("data.table", repos = "https://Rdatatable.gitlab.io/data.table")
library(data.table)

install.packages.auto("tidyverse")
install.packages.auto("knitr")
install.packages.auto("DT")
install.packages.auto("eeptools")

install.packages.auto("openxlsx")

install.packages.auto("haven")
install.packages.auto("tableone")
install.packages.auto("sjPlot")

install.packages.auto("BlandAltmanLeh")

# Install the devtools package from Hadley Wickham
install.packages.auto('devtools')

# for plotting
install.packages.auto("pheatmap")
install.packages.auto("forestplot")
install.packages.auto("ggplot2")

install.packages.auto("ggpubr")

install.packages.auto("UpSetR")

devtools::install_github("thomasp85/patchwork")
Using github PAT from envvar GITHUB_PAT
Skipping install of 'patchwork' from a github remote, the SHA1 (79223d30) has not changed since last install.
  Use `force = TRUE` to force installation
# for Seurat etc
install.packages.auto("org.Hs.eg.db")
install.packages.auto("mygene")
install.packages.auto("EnhancedVolcano")

# Install the devtools package from Hadley Wickham
install.packages.auto('devtools')
# Replace '2.3.4' with your desired version
# devtools::install_version(package = 'Seurat', version = package_version('2.3.4'))
# install.packages("Seurat")
install.packages.auto("Seurat") # latest version
Loading required package: Seurat
Attaching SeuratObject

Attaching package: 'Seurat'

The following object is masked from 'package:Hmisc':

    Key

The following object is masked from 'package:SummarizedExperiment':

    Assays

The following object is masked from 'package:DT':

    JS
library("Seurat")

Today = format(as.Date(as.POSIXlt(Sys.time())), "%Y%m%d")
Today.Report = format(as.Date(as.POSIXlt(Sys.time())), "%A, %B %d, %Y")

### UtrechtScienceParkColoursScheme
###
### WebsitetoconvertHEXtoRGB:http://hex.colorrrs.com.
### Forsomefunctionsyoushoulddividethesenumbersby255.
###
### No. Color                 HEX   (RGB)                                     CHR         MAF/INFO
###---------------------------------------------------------------------------------------
### 1     yellow                #FBB820 (251,184,32)                      =>    1       or 1.0>INFO
### 2     gold                #F59D10 (245,157,16)                    =>    2       
### 3     salmon                #E55738 (229,87,56)                   =>    3       or 0.05<MAF<0.2 or 0.4<INFO<0.6
### 4     darkpink          #DB003F ((219,0,63)                   =>    4       
### 5     lightpink         #E35493 (227,84,147)                      =>    5       or 0.8<INFO<1.0
### 6     pink                #D5267B (213,38,123)                    =>    6       
### 7     hardpink          #CC0071 (204,0,113)                   =>    7       
### 8     lightpurple       #A8448A (168,68,138)                      =>    8       
### 9     purple                #9A3480 (154,52,128)                      =>    9       
### 10  lavendel            #8D5B9A (141,91,154)                      =>    10      
### 11  bluepurple        #705296 (112,82,150)                    =>    11      
### 12  purpleblue        #686AA9 (104,106,169)               =>    12      
### 13  lightpurpleblue #6173AD (97,115,173/101,120,180)    =>  13      
### 14  seablue             #4C81BF (76,129,191)                      =>    14      
### 15  skyblue             #2F8BC9 (47,139,201)                      =>    15      
### 16  azurblue            #1290D9 (18,144,217)                      =>    16      or 0.01<MAF<0.05 or 0.2<INFO<0.4
### 17  lightazurblue     #1396D8 (19,150,216)                    =>    17      
### 18  greenblue           #15A6C1 (21,166,193)                      =>    18      
### 19  seaweedgreen      #5EB17F (94,177,127)                    =>    19      
### 20  yellowgreen       #86B833 (134,184,51)                    =>    20      
### 21  lightmossgreen  #C5D220 (197,210,32)                      =>    21      
### 22  mossgreen           #9FC228 (159,194,40)                      =>    22      or MAF>0.20 or 0.6<INFO<0.8
### 23  lightgreen      #78B113 (120,177,19)                      =>    23/X
### 24  green                 #49A01D (73,160,29)                     =>    24/Y
### 25  grey                  #595A5C (89,90,92)                        =>  25/XY   or MAF<0.01 or 0.0<INFO<0.2
### 26  lightgrey           #A2A3A4 (162,163,164)                 =>    26/MT
###
### ADDITIONAL COLORS
### 27  midgrey         #D7D8D7
### 28  verylightgrey   #ECECEC"
### 29  white           #FFFFFF
### 30  black           #000000
###----------------------------------------------------------------------------------------------

uithof_color = c("#FBB820","#F59D10","#E55738","#DB003F","#E35493","#D5267B",
                 "#CC0071","#A8448A","#9A3480","#8D5B9A","#705296","#686AA9",
                 "#6173AD","#4C81BF","#2F8BC9","#1290D9","#1396D8","#15A6C1",
                 "#5EB17F","#86B833","#C5D220","#9FC228","#78B113","#49A01D",
                 "#595A5C","#A2A3A4", "#D7D8D7", "#ECECEC", "#FFFFFF", "#000000")

uithof_color_legend = c("#FBB820", "#F59D10", "#E55738", "#DB003F", "#E35493",
                        "#D5267B", "#CC0071", "#A8448A", "#9A3480", "#8D5B9A",
                        "#705296", "#686AA9", "#6173AD", "#4C81BF", "#2F8BC9",
                        "#1290D9", "#1396D8", "#15A6C1", "#5EB17F", "#86B833",
                        "#C5D220", "#9FC228", "#78B113", "#49A01D", "#595A5C",
                        "#A2A3A4", "#D7D8D7", "#ECECEC", "#FFFFFF", "#000000")
### ----------------------------------------------------------------------------

ERA-CVD ‘druggable-MI-targets’

For the ERA-CVD ‘druggable-MI-targets’ project (grantnumber: 01KL1802) we performed two related RNA sequencing (RNAseq) experiments:

  1. conventional (‘bulk’) RNAseq using RNA extracted from carotid plaque samples, n ± 700. As of Saturday, March 19, 2022 all samples have been selected and RNA has been extracted; quality control (QC) was performed and we have a dataset of 635 samples.

  2. single-cell RNAseq (scRNAseq) of at least n = 40 samples (20 females, 20 males). As of Saturday, March 19, 2022 data is available of 40 samples (3 females, 15 males), we are extending sampling to get more female samples.

Plaque samples are derived from carotid endarterectomies as part of the Athero-Express Biobank Study which is an ongoing study in the UMC Utrecht.

Background

Here we map the HDAC9 to single-cells from the plaques.


library(openxlsx)

gene_list_df <- read.xlsx(paste0(PROJECT_loc, "/targets/Genes.xlsx"), sheet = "Genes")

target_genes <- unlist(gene_list_df$Gene)
target_genes
[1] "HDAC9"  "TWIST1" "IL6"    "IL1B"  

Load data

First we will load the data:

  • scRNAseq experimental data and rename the cell types.
  • Athero-Express clinical data.

Here we load the latest dataset from our Athero-Express single-cell RNA experiment.


# load(paste0(AESCRNA_loc, "/20210811.46.patients.KP.RData"))
# scRNAseqData <- seuset
# rm(seuset)
# 
# saveRDS(scRNAseqData, paste0(AESCRNA_loc, "/20210811.46.patients.KP.RDS"))

scRNAseqData <- readRDS(paste0(AESCRNA_loc, "/20210811.46.patients.KP.RDS"))

scRNAseqData
An object of class Seurat 
36147 features across 4948 samples within 2 assays 
Active assay: RNA (20111 features, 0 variable features)
 1 other assay present: SCT
 2 dimensional reductions calculated: pca, umap

The naming/classification is based on a combination conventional markers. We do not claim to know the exact identity of each cell, rather we refer to cells as ‘KIT+ Mast cells”-like cells. Likewise we refer to the cell clusters as ’communities’ of cells that exhibit similar properties, i.e. similar defining markers (e.g. KIT).

We will rename the cell types to human readable names.

### change names for clarity
backup.scRNAseqData = scRNAseqData
# get the old names to change to new names
UMAPPlot(scRNAseqData, label = FALSE, pt.size = 1.25, label.size = 4, group.by = "ident")

unique(scRNAseqData@active.ident)
 [1] CD3+ T Cells I                                 CD3+ T Cells IV                                CD34+ Endothelial Cells I                     
 [4] CD3+ T Cells V                                 CD3+CD56+ NK Cells II                          CD3+ T Cells VI                               
 [7] CD68+IL18+TLR4+TREM2+ Resident macrophages     CD3+CD56+ NK Cells I                           ACTA2+ Smooth Muscle Cells                    
[10] CD3+ T Cells II                                FOXP3+ T Cells                                 CD34+ Endothelial Cells II                    
[13] CD3+ T Cells III                               CD68+CD1C+ Dendritic Cells                     CD68+CASP1+IL1B+SELL+ Inflammatory macrophages
[16] CD79A+ Class-switched Memory B Cells           CD68+ABCA1+OLR1+TREM2+ Foam Cells              CD68+KIT+ Mast Cells                          
[19] CD68+CD4+ Monocytes                            CD79+ Plasma B Cells                          
20 Levels: CD3+ T Cells I CD3+ T Cells II CD3+ T Cells III CD3+ T Cells IV CD68+IL18+TLR4+TREM2+ Resident macrophages ... CD79+ Plasma B Cells
celltypes <- c("CD68+CD4+ Monocytes" = "CD68+CD4+ Mono", 
               "CD68+IL18+TLR4+TREM2+ Resident macrophages" = "CD68+IL18+TLR4+TREM2+ MRes", 
               "CD68+CD1C+ Dendritic Cells" = "CD68+CD1C+ DC",
               "CD68+CASP1+IL1B+SELL+ Inflammatory macrophages" = "CD68+CASP1+IL1B+SELL MInf",
               "CD68+ABCA1+OLR1+TREM2+ Foam Cells" = "CD68+ABCA1+OLR1+TREM2+ FC",
               
               # T-cells
               "CD3+ T Cells I" = "CD3+ TC I",
               "CD3+ T Cells II" = "CD3+ TC II", 
               "CD3+ T Cells III" = "CD3+ TC III", 
               "CD3+ T Cells IV" = "CD3+ TC IV", 
               "CD3+ T Cells V" = "CD3+ TC V", 
               "CD3+ T Cells VI" = "CD3+ TC VI", 
               "FOXP3+ T Cells" = "FOXP3+ TC",
               
               # Endothelial cells
               "CD34+ Endothelial Cells I" = "CD34+ EC I", 
               "CD34+ Endothelial Cells II" = "CD34+ EC II", 
               
               # SMC
               "ACTA2+ Smooth Muscle Cells" = "ACTA2+ SMC", 
               
               # NK Cells
               "CD3+CD56+ NK Cells I" = "CD3+CD56+ NK I",
               "CD3+CD56+ NK Cells II" = "CD3+CD56+ NK II",
               # Mast
               "CD68+KIT+ Mast Cells" = "CD68+KIT+ MC",
               
               "CD79A+ Class-switched Memory B Cells" = "CD79A+ BCmem", 
               "CD79+ Plasma B Cells" = "CD79+ BCplasma")

scRNAseqData <- Seurat::RenameIdents(object = scRNAseqData, 
                                       celltypes)
UMAPPlot(scRNAseqData, label = TRUE, pt.size = 1.25, label.size = 4, group.by = "ident",
         repel = TRUE)

Clinical data

Loading the Athero-Express clinical data.


AEDB.CEA <- readRDS(file = paste0(OUT_loc, "/20220319.",TRAIT_OF_INTEREST,".AEDB.CEA.RDS"))

# Baseline table variables
basetable_vars = c("Hospital", "ORyear", "Artery_summary",
                   "Age", "Gender", 
                   # "TC_finalCU", "LDL_finalCU", "HDL_finalCU", "TG_finalCU", 
                   "TC_final", "LDL_final", "HDL_final", "TG_final", 
                   # "hsCRP_plasma",
                   "systolic", "diastoli", "GFR_MDRD", "BMI", 
                   "KDOQI", "BMI_WHO",
                   "SmokerStatus", "AlcoholUse",
                   "DiabetesStatus", 
                   "Hypertension.selfreport", "Hypertension.selfreportdrug", "Hypertension.composite", "Hypertension.drugs", 
                   "Med.anticoagulants", "Med.all.antiplatelet", "Med.Statin.LLD", 
                   "Stroke_Dx", "sympt", "Symptoms.5G", "AsymptSympt", "AsymptSympt2G",
                   "Symptoms.Update2G", "Symptoms.Update3G", "indexsymptoms_latest_4g",
                   "restenos", "stenose",
                   "CAD_history", "PAOD", "Peripheral.interv", 
                   "EP_composite", "EP_composite_time", "EP_major", "EP_major_time",
                   "MAC_rankNorm", "SMC_rankNorm", "Macrophages.bin", "SMC.bin",
                   "Neutrophils_rankNorm", "MastCells_rankNorm",
                   "IPH.bin", "VesselDensity_rankNorm",
                   "Calc.bin", "Collagen.bin", 
                   "Fat.bin_10", "Fat.bin_40", "OverallPlaquePhenotype", "Plaque_Vulnerability_Index")

basetable_bin = c("Gender",  "Artery_summary",
                  "KDOQI", "BMI_WHO",
                  "SmokerStatus", "AlcoholUse",
                  "DiabetesStatus", 
                  "Hypertension.selfreport", "Hypertension.selfreportdrug", "Hypertension.composite", "Hypertension.drugs", 
                  "Med.anticoagulants", "Med.all.antiplatelet", "Med.Statin.LLD", 
                  "Stroke_Dx", "sympt", "Symptoms.5G", "AsymptSympt", "AsymptSympt2G",
                  "Symptoms.Update2G", "Symptoms.Update3G", "indexsymptoms_latest_4g",
                  "restenos", "stenose",
                  "CAD_history", "PAOD", "Peripheral.interv", 
                  "EP_major", "EP_composite", "Macrophages.bin", "SMC.bin",
                  "IPH.bin", 
                  "Calc.bin", "Collagen.bin", 
                  "Fat.bin_10", "Fat.bin_40", "OverallPlaquePhenotype", "Plaque_Vulnerability_Index")
# basetable_bin

basetable_con = basetable_vars[!basetable_vars %in% basetable_bin]
# basetable_con

AESCRNA: baseline characteristics

Preparation

metadata <- scRNAseqData@meta.data %>% as_tibble() %>% separate(orig.ident, c("Patient", NA))
scRNAseqDataMeta <- metadata %>% distinct(Patient, .keep_all = TRUE)

scRNAseqDataMetaAE <- merge(scRNAseqDataMeta, AEDB.CEA, by.x = "Patient", by.y = "STUDY_NUMBER", sort = FALSE, all.x = TRUE)
dim(scRNAseqDataMetaAE)
[1]   46 1144
# Replace missing data 
# Ref: https://cran.r-project.org/web/packages/naniar/vignettes/replace-with-na.html
require(naniar)

na_strings <- c("NA", "N A", "N / A", "N/A", "N/ A", 
                "Not Available", "Not available", 
                "missing", 
                "-999", "-99", 
                "No data available/missing", "No data available/Missing")
# Then you write ~.x %in% na_strings - which reads as “does this value occur in the list of NA strings”.

scRNAseqDataMetaAE %>%
  replace_with_na_all(condition = ~.x %in% na_strings)
cat("====================================================================================================")
====================================================================================================
cat("SELECTION THE SHIZZLE")
SELECTION THE SHIZZLE
cat("- sanity checking PRIOR to selection")
- sanity checking PRIOR to selection
library(data.table)
require(labelled)
ae.gender <- to_factor(scRNAseqDataMetaAE$Gender)
ae.hospital <- to_factor(scRNAseqDataMetaAE$Hospital)
table(ae.gender, ae.hospital, dnn = c("Sex", "Hospital"), useNA = "ifany")
        Hospital
Sex      St. Antonius, Nieuwegein UMC Utrecht <NA>
  female                        0          10    0
  male                          0          26    0
  <NA>                          0           0   10
ae.artery <- to_factor(scRNAseqDataMetaAE$Artery_summary)
table(ae.artery, ae.gender, dnn = c("Sex", "Artery"), useNA = "ifany")
                                                                                         Artery
Sex                                                                                       female male <NA>
  No artery known (yet), no surgery (patient ill, died, exited study), re-numbered to AAA      0    0    0
  carotid (left & right)                                                                      10   25    0
  femoral/iliac (left, right or both sides)                                                    0    0    0
  other carotid arteries (common, external)                                                    0    1    0
  carotid bypass and injury (left, right or both sides)                                        0    0    0
  aneurysmata (carotid & femoral)                                                              0    0    0
  aorta                                                                                        0    0    0
  other arteries (renal, popliteal, vertebral)                                                 0    0    0
  femoral bypass, angioseal and injury (left, right or both sides)                             0    0    0
  <NA>                                                                                         0    0   10
ae.ic <- to_factor(scRNAseqDataMetaAE$informedconsent)
table(ae.ic, ae.gender, useNA = "ifany")
                                                                                                 ae.gender
ae.ic                                                                                             female male <NA>
  missing                                                                                              0    0    0
  no, died                                                                                             0    0    0
  yes                                                                                                  6   14    0
  yes, health treatment when possible                                                                  2    7    0
  yes, no health treatment                                                                             1    2    0
  yes, no health treatment, no commercial business                                                     1    2    0
  yes, no tissue, no commerical business                                                               0    0    0
  yes, no tissue, no questionnaires, no medical info, no commercial business                           0    0    0
  yes, no questionnaires, no health treatment, no commercial business                                  0    0    0
  yes, no questionnaires, health treatment when possible                                               0    0    0
  yes, no tissue, no questionnaires, no health treatment, no commerical business                       0    0    0
  yes, no health treatment, no medical info, no commercial business                                    0    0    0
  yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business      0    0    0
  yes, no questionnaires, no health treatment                                                          0    0    0
  yes, no tissue, no health treatment                                                                  0    0    0
  yes, no tissue, no questionnaires                                                                    0    0    0
  yes, no tissue, health treatment when possible                                                       0    0    0
  yes, no tissue                                                                                       0    0    0
  yes, no commerical business                                                                          0    1    0
  yes, health treatment when possible, no commercial business                                          0    0    0
  yes, no medical info, no commercial business                                                         0    0    0
  yes, no questionnaires                                                                               0    0    0
  yes, no tissue, no questionnaires, no health treatment, no medical info                              0    0    0
  yes, no tissue, no questionnaires, no health treatment, no commercial business                       0    0    0
  yes, no medical info                                                                                 0    0    0
  yes, no questionnaires, no commercial business                                                       0    0    0
  yes, no questionnaires, no health treatment, no medical info                                         0    0    0
  yes, no questionnaires, health treatment when possible, no commercial business                       0    0    0
  yes,  no health treatment, no medical info                                                           0    0    0
  no, doesn't want to                                                                                  0    0    0
  no, unable to sign                                                                                   0    0    0
  no, no reaction                                                                                      0    0    0
  no, lost                                                                                             0    0    0
  no, too old                                                                                          0    0    0
  yes, no medical info, health treatment when possible                                                 0    0    0
  no (never asked for IC because there was no tissue)                                                  0    0    0
  yes, no medical info, no commercial business, health treatment when possible                         0    0    0
  no, endpoint                                                                                         0    0    0
  wil niets invullen, wel alles gebruiken                                                              0    0    0
  second informed concents: yes, no commercial business                                                0    0    0
  nooit geincludeerd                                                                                   0    0    0
  <NA>                                                                                                 0    0   10
rm(ae.gender, ae.hospital, ae.artery, ae.ic)


scRNAseqDataMetaAE.all <- subset(scRNAseqDataMetaAE,
                                 (Artery_summary == "carotid (left & right)" | Artery_summary == "other carotid arteries (common, external)" ) & # we only want carotids
                                   informedconsent != "missing" & # we are really strict in selecting based on 'informed consent'!
                                   informedconsent != "no, died" &
                                   informedconsent != "yes, no tissue, no commerical business" &
                                   informedconsent != "yes, no tissue, no questionnaires, no medical info, no commercial business" &
                                   informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commerical business" &
                                   informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business" &
                                   informedconsent != "yes, no tissue, no health treatment" &
                                   informedconsent != "yes, no tissue, no questionnaires" &
                                   informedconsent != "yes, no tissue, health treatment when possible" &
                                   informedconsent != "yes, no tissue" &
                                   informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info" &
                                   informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commercial business" &
                                   informedconsent != "no, doesn't want to" &
                                   informedconsent != "no, unable to sign" &
                                   informedconsent != "no, no reaction" &
                                   informedconsent != "no, lost" &
                                   informedconsent != "no, too old" &
                                   informedconsent != "yes, no medical info, health treatment when possible" & 
                                   informedconsent != "no (never asked for IC because there was no tissue)" &
                                   informedconsent != "no, endpoint" &
                                   informedconsent != "nooit geincludeerd" & 
                                   informedconsent != "yes, no health treatment, no commercial business" & # IMPORTANT: since we are sharing with a commercial party
                                   informedconsent != "yes, no tissue, no commerical business" & 
                                   informedconsent != "yes, no tissue, no questionnaires, no medical info, no commercial business" & 
                                   informedconsent != "yes, no questionnaires, no health treatment, no commercial business" & 
                                   informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commerical business" & 
                                   informedconsent != "yes, no health treatment, no medical info, no commercial business" & 
                                   informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business" & 
                                   informedconsent != "yes, no commerical business" & 
                                   informedconsent != "yes, health treatment when possible, no commercial business" & 
                                   informedconsent != "yes, no medical info, no commercial business" & 
                                   informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commercial business" & 
                                   informedconsent != "yes, no questionnaires, no commercial business" & 
                                   informedconsent != "yes, no questionnaires, health treatment when possible, no commercial business" & 
                                   informedconsent != "second informed concents: yes, no commercial business")
# scRNAseqDataMetaAE.all[1:10, 1:10]
dim(scRNAseqDataMetaAE.all)
[1]   32 1144
# DT::datatable(scRNAseqDataMetaAE.all)

Baseline

Showing the baseline table for the scRNAseq data in 39 CEA patients with informed consent.

cat("===========================================================================================")
===========================================================================================
cat("CREATE BASELINE TABLE")
CREATE BASELINE TABLE
# Create baseline tables
# http://rstudio-pubs-static.s3.amazonaws.com/13321_da314633db924dc78986a850813a50d5.html
scRNAseqDataMetaAE.all.tableOne = print(CreateTableOne(vars = basetable_vars, 
                                                  # factorVars = basetable_bin,
                                                  # strata = "Gender",
                                                  data = scRNAseqDataMetaAE.all, includeNA = TRUE), 
                                   nonnormal = c(), 
                                   quote = FALSE, showAllLevels = TRUE,
                                   format = "p", 
                                   contDigits = 3)[,1:2]
Warning in ModuleReturnVarsExist(vars, data) :
  These variables only have NA/NaN: MAC_rankNorm SMC_rankNorm Macrophages.bin SMC.bin Neutrophils_rankNorm MastCells_rankNorm IPH.bin VesselDensity_rankNorm Calc.bin Collagen.bin Fat.bin_10 Fat.bin_40 OverallPlaquePhenotype  Dropped
                                     
                                      level                                                                                   Overall         
  n                                                                                                                                32         
  Hospital (%)                        St. Antonius, Nieuwegein                                                                    0.0         
                                      UMC Utrecht                                                                               100.0         
  ORyear (%)                          No data available/missing                                                                   0.0         
                                      2002                                                                                        0.0         
                                      2003                                                                                        0.0         
                                      2004                                                                                        0.0         
                                      2005                                                                                        0.0         
                                      2006                                                                                        0.0         
                                      2007                                                                                        0.0         
                                      2008                                                                                        0.0         
                                      2009                                                                                        0.0         
                                      2010                                                                                        0.0         
                                      2011                                                                                        0.0         
                                      2012                                                                                        0.0         
                                      2013                                                                                        0.0         
                                      2014                                                                                        0.0         
                                      2015                                                                                        0.0         
                                      2016                                                                                        0.0         
                                      2017                                                                                        0.0         
                                      2018                                                                                       62.5         
                                      2019                                                                                       37.5         
  Artery_summary (%)                  No artery known (yet), no surgery (patient ill, died, exited study), re-numbered to AAA     0.0         
                                      carotid (left & right)                                                                     96.9         
                                      femoral/iliac (left, right or both sides)                                                   0.0         
                                      other carotid arteries (common, external)                                                   3.1         
                                      carotid bypass and injury (left, right or both sides)                                       0.0         
                                      aneurysmata (carotid & femoral)                                                             0.0         
                                      aorta                                                                                       0.0         
                                      other arteries (renal, popliteal, vertebral)                                                0.0         
                                      femoral bypass, angioseal and injury (left, right or both sides)                            0.0         
  Age (mean (SD))                                                                                                              72.156 (8.651) 
  Gender (%)                          female                                                                                     28.1         
                                      male                                                                                       71.9         
  TC_final (mean (SD))                                                                                                          4.467 (1.261) 
  LDL_final (mean (SD))                                                                                                         2.659 (1.008) 
  HDL_final (mean (SD))                                                                                                         1.120 (0.238) 
  TG_final (mean (SD))                                                                                                          1.892 (1.124) 
  systolic (mean (SD))                                                                                                        152.516 (27.422)
  diastoli (mean (SD))                                                                                                         80.452 (17.171)
  GFR_MDRD (mean (SD))                                                                                                         82.510 (32.197)
  BMI (mean (SD))                                                                                                              26.458 (3.556) 
  KDOQI (%)                           No data available/missing                                                                   0.0         
                                      Normal kidney function                                                                     31.2         
                                      CKD 2 (Mild)                                                                               34.4         
                                      CKD 3 (Moderate)                                                                           25.0         
                                      CKD 4 (Severe)                                                                              0.0         
                                      CKD 5 (Failure)                                                                             0.0         
                                      <NA>                                                                                        9.4         
  BMI_WHO (%)                         No data available/missing                                                                   0.0         
                                      Underweight                                                                                 3.1         
                                      Normal                                                                                     31.2         
                                      Overweight                                                                                 40.6         
                                      Obese                                                                                      15.6         
                                      <NA>                                                                                        9.4         
  SmokerStatus (%)                    Current smoker                                                                             34.4         
                                      Ex-smoker                                                                                  46.9         
                                      Never smoked                                                                               12.5         
                                      <NA>                                                                                        6.2         
  AlcoholUse (%)                      No                                                                                         34.4         
                                      Yes                                                                                        56.2         
                                      <NA>                                                                                        9.4         
  DiabetesStatus (%)                  Control (no Diabetes Dx/Med)                                                               65.6         
                                      Diabetes                                                                                   31.2         
                                      <NA>                                                                                        3.1         
  Hypertension.selfreport (%)         No data available/missing                                                                   0.0         
                                      no                                                                                          9.4         
                                      yes                                                                                        84.4         
                                      <NA>                                                                                        6.2         
  Hypertension.selfreportdrug (%)     No data available/missing                                                                   0.0         
                                      no                                                                                          9.4         
                                      yes                                                                                        84.4         
                                      <NA>                                                                                        6.2         
  Hypertension.composite (%)          No data available/missing                                                                   0.0         
                                      no                                                                                          6.2         
                                      yes                                                                                        90.6         
                                      <NA>                                                                                        3.1         
  Hypertension.drugs (%)              No data available/missing                                                                   0.0         
                                      no                                                                                          6.2         
                                      yes                                                                                        87.5         
                                      <NA>                                                                                        6.2         
  Med.anticoagulants (%)              No data available/missing                                                                   0.0         
                                      no                                                                                         84.4         
                                      yes                                                                                         6.2         
                                      <NA>                                                                                        9.4         
  Med.all.antiplatelet (%)            No data available/missing                                                                   0.0         
                                      no                                                                                         25.0         
                                      yes                                                                                        68.8         
                                      <NA>                                                                                        6.2         
  Med.Statin.LLD (%)                  No data available/missing                                                                   0.0         
                                      no                                                                                         21.9         
                                      yes                                                                                        71.9         
                                      <NA>                                                                                        6.2         
  Stroke_Dx (%)                       Missing                                                                                     0.0         
                                      No stroke diagnosed                                                                        50.0         
                                      Stroke diagnosed                                                                           46.9         
                                      <NA>                                                                                        3.1         
  sympt (%)                           missing                                                                                     0.0         
                                      Asymptomatic                                                                               18.8         
                                      TIA                                                                                        15.6         
                                      minor stroke                                                                               31.2         
                                      Major stroke                                                                                6.2         
                                      Amaurosis fugax                                                                            15.6         
                                      Four vessel disease                                                                         0.0         
                                      Vertebrobasilary TIA                                                                        0.0         
                                      Retinal infarction                                                                          3.1         
                                      Symptomatic, but aspecific symtoms                                                          0.0         
                                      Contralateral symptomatic occlusion                                                         0.0         
                                      retinal infarction                                                                          3.1         
                                      armclaudication due to occlusion subclavian artery, CEA needed for bypass                   0.0         
                                      retinal infarction + TIAs                                                                   0.0         
                                      Ocular ischemic syndrome                                                                    6.2         
                                      ischemisch glaucoom                                                                         0.0         
                                      subclavian steal syndrome                                                                   0.0         
                                      TGA                                                                                         0.0         
  Symptoms.5G (%)                     Asymptomatic                                                                               18.8         
                                      Ocular                                                                                     21.9         
                                      Other                                                                                       0.0         
                                      Retinal infarction                                                                          6.2         
                                      Stroke                                                                                     37.5         
                                      TIA                                                                                        15.6         
  AsymptSympt (%)                     Asymptomatic                                                                               18.8         
                                      Ocular and others                                                                          28.1         
                                      Symptomatic                                                                                53.1         
  AsymptSympt2G (%)                   Asymptomatic                                                                               18.8         
                                      Symptomatic                                                                                81.2         
  Symptoms.Update2G (%)               Asymptomatic                                                                               18.8         
                                      Symptomatic                                                                                81.2         
  Symptoms.Update3G (%)               Asymptomatic                                                                               18.8         
                                      Symptomatic                                                                                81.2         
                                      Unclear                                                                                     0.0         
  indexsymptoms_latest_4g (mean (SD))                                                                                           1.719 (1.170) 
  restenos (%)                        missing                                                                                     0.0         
                                      de novo                                                                                   100.0         
                                      restenosis                                                                                  0.0         
                                      stenose bij angioseal na PTCA                                                               0.0         
  stenose (%)                         missing                                                                                     0.0         
                                      0-49%                                                                                       3.1         
                                      50-70%                                                                                     12.5         
                                      70-90%                                                                                     43.8         
                                      90-99%                                                                                     21.9         
                                      100% (Occlusion)                                                                            0.0         
                                      NA                                                                                          0.0         
                                      50-99%                                                                                      0.0         
                                      70-99%                                                                                     18.8         
                                      99                                                                                          0.0         
  CAD_history (%)                     Missing                                                                                     0.0         
                                      No history CAD                                                                             78.1         
                                      History CAD                                                                                18.8         
                                      <NA>                                                                                        3.1         
  PAOD (%)                            missing/no data                                                                             0.0         
                                      no                                                                                         81.2         
                                      yes                                                                                        15.6         
                                      <NA>                                                                                        3.1         
  Peripheral.interv (%)               no                                                                                         78.1         
                                      yes                                                                                        18.8         
                                      <NA>                                                                                        3.1         
  EP_composite (%)                    No data available.                                                                          0.0         
                                      No composite endpoints                                                                     37.5         
                                      Composite endpoints                                                                        12.5         
                                      <NA>                                                                                       50.0         
  EP_composite_time (mean (SD))                                                                                                 0.905 (0.522) 
  EP_major (%)                        No data available.                                                                          0.0         
                                      No major events (endpoints)                                                                40.6         
                                      Major events (endpoints)                                                                    9.4         
                                      <NA>                                                                                       50.0         
  EP_major_time (mean (SD))                                                                                                     0.905 (0.522) 
  Plaque_Vulnerability_Index (%)      0                                                                                         100.0         
                                      1                                                                                           0.0         
                                      2                                                                                           0.0         
                                      3                                                                                           0.0         
                                      4                                                                                           0.0         
                                      5                                                                                           0.0         

Writing the baseline table to Excel format.

# Write basetable
require(openxlsx)
# write.xlsx(file = paste0(BASELINE_loc, "/",Today,".",PROJECTNAME,".AESCRNA.CEA.39pts.after_qc.IC_commercial.BaselineTable.xlsx"), 
#            format(scRNAseqDataMetaAE.all.tableOne, digits = 5, scientific = FALSE) , 
#            rowNames = TRUE, colNames = TRUE, overwrite = TRUE)

write.xlsx(file = paste0(BASELINE_loc, "/",Today,".",PROJECTNAME,".AESCRNA.CEA.32pts.after_qc.IC_academic.BaselineTable.xlsx"), 
           format(scRNAseqDataMetaAE.all.tableOne, digits = 5, scientific = FALSE) , 
           rowNames = TRUE, colNames = TRUE, overwrite = TRUE)

AESCRNA

Quality control

Here review the number of cells per sample, plate, and patients. And plot the ratio’s per sample and study number.

## check stuff
cat("\nHow many cells per type ...?")

How many cells per type ...?
sort(table(scRNAseqData@meta.data$SCT_snn_res.0.8))
integer(0)
# cat("\n\nHow many cells per plate ...?")
# sort(table(scRNAseqData@meta.data$ID))

# cat("\n\nHow many cells per type per plate ...?")
# table(scRNAseqData@meta.data$SCT_snn_res.0.8, scRNAseqData@meta.data$ID)

cat("\n\nHow many cells per patient ...?")


How many cells per patient ...?
sort(table(scRNAseqData@meta.data$Patient))

4530 4675 4440 4605 4653 4472 4458 4455 4476 4587 4496 4601 4502 4501 4571 4478 4448 4477 4452 4459 4520 4602 4489 4432 4495 4545 4558 4480 4447 4500 4513 4535 
   3    4    6    7   20   22   35   54   59   60   70   70   73   75   76   77   80   84   92   94   96   96   97   99  102  106  107  112  114  116  123  130 
4676 4486 4470 4487 4546 4488 4521 4580 4491 4541 4450 4542 4453 4443 
 135  137  144  144  144  146  161  163  175  178  205  213  222  422 
cat("\n\nVisualizing these ratio's per study number and sample ...?")


Visualizing these ratio's per study number and sample ...?
UMAPPlot(scRNAseqData, label = TRUE, pt.size = 1.25, label.size = 4, group.by = "ident",
         repel = TRUE)

ggsave(paste0(PLOT_loc, "/", Today, ".UMAP.png"), plot = last_plot())
Saving 18 x 12 in image
ggsave(paste0(PLOT_loc, "/", Today, ".UMAP.ps"), plot = last_plot())
Saving 18 x 12 in image
# barplot(prop.table(x = table(scRNAseqData@active.ident, scRNAseqData@meta.data$Patient)), 
#         cex.axis = 1.0, cex.names = 0.5, las = 1,
#         col = uithof_color, xlab = "study number", legend.text = FALSE, args.legend = list(x = "bottom"))
# dev.copy(pdf, paste0(QC_loc, "/", Today, ".cell_ratios_per_sample.pdf"))
# dev.off()

# barplot(prop.table(x = table(scRNAseqData@active.ident, scRNAseqData@meta.data$ID)), 
#         cex.axis = 1.0, cex.names = 0.5, las = 2,
#         col = uithof_color, xlab = "sample ID", legend.text = FALSE, args.legend = list(x = "bottom"))
# dev.copy(pdf, paste0(QC_loc, "/", Today, ".cell_ratios_per_sample_per_plate.pdf"))
# dev.off()

Visualisations

Let’s project known cellular markers.


UMAPPlot(scRNAseqData, label = FALSE, pt.size = 1.25, label.size = 4, group.by = "ident",
         repel = TRUE)


# endothelial cells
FeaturePlot(scRNAseqData, features = c("CD34"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("EDN1"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("EDNRA", "EDNRB"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("CDH5", "PECAM1"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("ACKR1"), cols =  c("#ECECEC", "#DB003F"))


# SMC
FeaturePlot(scRNAseqData, features = c("MYH11"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("LGALS3", "ACTA2"), cols =  c("#ECECEC", "#DB003F"))


# macrophages
FeaturePlot(scRNAseqData, features = c("CD14", "CD68"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("CD36"), cols =  c("#ECECEC", "#DB003F"))


# t-cells
FeaturePlot(scRNAseqData, features = c("CD3E"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("CD4"), cols =  c("#ECECEC", "#DB003F"))

# FeaturePlot(scRNAseqData, features = c("CD8"), cols =  c("#ECECEC", "#DB003F"))

# b-cells
FeaturePlot(scRNAseqData, features = c("CD79A"), cols =  c("#ECECEC", "#DB003F"))


# mast cells
FeaturePlot(scRNAseqData, features = c("KIT"), cols =  c("#ECECEC", "#DB003F"))


# NK cells
FeaturePlot(scRNAseqData, features = c("NCAM1"), cols =  c("#ECECEC", "#DB003F"))

Targets of interest:

We check whether the targets genes were sequenced using our method.

length(target_genes)
[1] 4
target_genes
[1] "HDAC9"  "TWIST1" "IL6"    "IL1B"  

Expression in cell communities


# target_genes_rm <- c("AC011294.3", "C6orf195", "C9orf53", "AL137026.1", "RP11-145E5.5",
#                      "ZNF32", "BCAM", "DUPD1", "PVRL2")
# 
# temp = target_genes[!target_genes %in% target_genes_rm]
# 
# target_genes_qc <- c(temp, "DUSP27", "NECTIN2")

target_genes_qc <- target_genes
target_genes_qc
[1] "HDAC9"  "TWIST1" "IL6"    "IL1B"  
library(RColorBrewer)

p1 <- DotPlot(scRNAseqData, features = target_genes_qc,
        cols = "RdBu")

p1 + theme(axis.text.x = element_text(angle = 45, hjust=1, size = 5))


ggsave(paste0(PLOT_loc, "/", Today, ".DotPlot.Targets.png"), plot = last_plot())
Saving 18 x 12 in image
ggsave(paste0(PLOT_loc, "/", Today, ".DotPlot.Targets.ps"), plot = last_plot())
Saving 18 x 12 in image
ggsave(paste0(PLOT_loc, "/", Today, ".DotPlot.Targets.pdf"), plot = last_plot())
Saving 18 x 12 in image
rm(p1)

# FeaturePlot(scRNAseqData, features = c(target_genes_qc),
#             cols =  c("#ECECEC", "#DB003F", "#9A3480","#1290D9"),
#             combine = TRUE)
# 
# ggsave(paste0(PLOT_loc, "/", Today, ".FeaturePlot.Targets.png"), plot = last_plot())
# ggsave(paste0(PLOT_loc, "/", Today, ".FeaturePlot.Targets.ps"), plot = last_plot())
# VlnPlot(scRNAseqData, features = "DUSP27")

# VlnPlot files
ifelse(!dir.exists(file.path(PLOT_loc, "/VlnPlot")), 
       dir.create(file.path(PLOT_loc, "/VlnPlot")), 
       FALSE)
[1] TRUE
VlnPlot_loc = paste0(PLOT_loc, "/VlnPlot")


for (GENE in target_genes_qc){
  print(paste0("Projecting the expression of ", GENE, "."))

  vp1 <-  VlnPlot(scRNAseqData, features = GENE) + 
    xlab("cell communities") + 
    ylab(bquote("normalized expression")) +
    theme(axis.title.x = element_text(color = "#000000", size = 14, face = "bold"), 
            axis.title.y = element_text(color = "#000000", size = 14, face = "bold"), 
            legend.position = "none")
    ggsave(paste0(VlnPlot_loc, "/", Today, ".VlnPlot.",GENE,".png"), plot = last_plot())
    ggsave(paste0(VlnPlot_loc, "/", Today, ".VlnPlot.",GENE,".ps"), plot = last_plot())
    ggsave(paste0(VlnPlot_loc, "/", Today, ".VlnPlot.",GENE,".pdf"), plot = last_plot())
  
  # print(vp1)
  
}
[1] "Projecting the expression of HDAC9."
Saving 7 x 7 in image
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of TWIST1."
Saving 7 x 7 in image
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of IL6."
Saving 7 x 7 in image
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of IL1B."
Saving 7 x 7 in image
Saving 7 x 7 in image
Saving 7 x 7 in image

Differential expression between cell communities

Here we project genes to only the broad cell communities:

  • macrophages
  • endothelial cells
  • smooth muscle cells
  • T-cells
  • B-cells
  • Mast cells
  • NK-cells
  • Mixed cells

Macrophages

unique(scRNAseqData@active.ident)
 [1] CD3+ TC I                  CD3+ TC IV                 CD34+ EC I                 CD3+ TC V                  CD3+CD56+ NK II           
 [6] CD3+ TC VI                 CD68+IL18+TLR4+TREM2+ MRes CD3+CD56+ NK I             ACTA2+ SMC                 CD3+ TC II                
[11] FOXP3+ TC                  CD34+ EC II                CD3+ TC III                CD68+CD1C+ DC              CD68+CASP1+IL1B+SELL MInf 
[16] CD79A+ BCmem               CD68+ABCA1+OLR1+TREM2+ FC  CD68+KIT+ MC               CD68+CD4+ Mono             CD79+ BCplasma            
20 Levels: CD68+CD4+ Mono CD68+IL18+TLR4+TREM2+ MRes CD68+CD1C+ DC CD68+CASP1+IL1B+SELL MInf CD68+ABCA1+OLR1+TREM2+ FC CD3+ TC I CD3+ TC II ... CD79+ BCplasma

Comparison between the macrophages cell communities (CD14/CD68+), and all other communities.


MAC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("CD68+CASP1+IL1B+SELL MInf", 
                                      "CD68+CD1C+ DC", 
                                      "CD68+CD4+ Mono",
                                      "CD68+IL18+TLR4+TREM2+ MRes",
                                      "CD68+ABCA1+OLR1+TREM2+ FC"), 
                          ident.2 = c(#"CD68+CASP1+IL1B+SELL MInf", 
                                      #"CD68+CD1C+ DC", 
                                      #"CD68+CD4+ Mono",
                                      #"CD68+IL18+TLR4+TREM2+ MRes",
                                      #"CD68+ABCA1+OLR1+TREM2+ FC",
                                      "CD3+ TC I",
                                      "CD3+ TC II", 
                                      "CD3+ TC III", 
                                      "CD3+ TC IV", 
                                      "CD3+ TC V", 
                                      "CD3+ TC VI", 
                                      "FOXP3+ TC", 
                                      "CD34+ EC I", 
                                      "CD34+ EC II",
                                      "ACTA2+ SMC", 
                                      "CD3+CD56+ NK I",
                                      "CD3+CD56+ NK II", 
                                      "CD68+KIT+ MC",
                                      "CD79+ BCplasma", 
                                      "CD79A+ BCmem"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 05s      
  |++                                                | 2 % ~01m 02s      
  |++                                                | 3 % ~01m 02s      
  |+++                                               | 4 % ~01m 03s      
  |+++                                               | 5 % ~01m 04s      
  |++++                                              | 6 % ~01m 03s      
  |++++                                              | 7 % ~01m 02s      
  |+++++                                             | 8 % ~01m 01s      
  |+++++                                             | 9 % ~01m 02s      
  |++++++                                            | 10% ~01m 01s      
  |++++++                                            | 11% ~60s          
  |+++++++                                           | 12% ~59s          
  |+++++++                                           | 13% ~58s          
  |++++++++                                          | 14% ~58s          
  |++++++++                                          | 15% ~57s          
  |+++++++++                                         | 16% ~56s          
  |+++++++++                                         | 17% ~56s          
  |++++++++++                                        | 18% ~55s          
  |++++++++++                                        | 19% ~54s          
  |+++++++++++                                       | 20% ~53s          
  |+++++++++++                                       | 21% ~53s          
  |++++++++++++                                      | 22% ~53s          
  |++++++++++++                                      | 23% ~52s          
  |+++++++++++++                                     | 24% ~51s          
  |+++++++++++++                                     | 25% ~50s          
  |++++++++++++++                                    | 26% ~50s          
  |++++++++++++++                                    | 27% ~49s          
  |+++++++++++++++                                   | 28% ~48s          
  |+++++++++++++++                                   | 29% ~48s          
  |++++++++++++++++                                  | 30% ~47s          
  |++++++++++++++++                                  | 31% ~46s          
  |+++++++++++++++++                                 | 32% ~46s          
  |+++++++++++++++++                                 | 33% ~45s          
  |++++++++++++++++++                                | 34% ~44s          
  |++++++++++++++++++                                | 35% ~44s          
  |+++++++++++++++++++                               | 36% ~43s          
  |+++++++++++++++++++                               | 37% ~42s          
  |++++++++++++++++++++                              | 38% ~41s          
  |++++++++++++++++++++                              | 39% ~41s          
  |+++++++++++++++++++++                             | 40% ~40s          
  |+++++++++++++++++++++                             | 41% ~39s          
  |++++++++++++++++++++++                            | 42% ~39s          
  |++++++++++++++++++++++                            | 43% ~38s          
  |+++++++++++++++++++++++                           | 44% ~37s          
  |+++++++++++++++++++++++                           | 45% ~37s          
  |++++++++++++++++++++++++                          | 46% ~36s          
  |++++++++++++++++++++++++                          | 47% ~35s          
  |+++++++++++++++++++++++++                         | 48% ~35s          
  |+++++++++++++++++++++++++                         | 49% ~34s          
  |++++++++++++++++++++++++++                        | 51% ~34s          
  |++++++++++++++++++++++++++                        | 52% ~33s          
  |+++++++++++++++++++++++++++                       | 53% ~32s          
  |+++++++++++++++++++++++++++                       | 54% ~31s          
  |++++++++++++++++++++++++++++                      | 55% ~31s          
  |++++++++++++++++++++++++++++                      | 56% ~30s          
  |+++++++++++++++++++++++++++++                     | 57% ~29s          
  |+++++++++++++++++++++++++++++                     | 58% ~29s          
  |++++++++++++++++++++++++++++++                    | 59% ~28s          
  |++++++++++++++++++++++++++++++                    | 60% ~27s          
  |+++++++++++++++++++++++++++++++                   | 61% ~27s          
  |+++++++++++++++++++++++++++++++                   | 62% ~26s          
  |++++++++++++++++++++++++++++++++                  | 63% ~25s          
  |++++++++++++++++++++++++++++++++                  | 64% ~25s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~24s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~23s          
  |++++++++++++++++++++++++++++++++++                | 67% ~23s          
  |++++++++++++++++++++++++++++++++++                | 68% ~22s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~21s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~21s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~20s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~19s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~19s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~18s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~17s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~16s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~16s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~15s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~14s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~14s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~13s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~12s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~12s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~11s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01m 08s
DT::datatable(MAC.markers)
MAC_Volcano_TargetsA = EnhancedVolcano(MAC.markers,
    lab = rownames(MAC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "Macrophage markers\n(Macrophage communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/(nrow(MAC.markers)), # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
MAC_Volcano_TargetsA

ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.MAC.DEG.Targets.pdf"), 
       plot = MAC_Volcano_TargetsA)
Saving 18 x 12 in image

The target results are given below and written to a file.

library(tibble)
MAC.markers <- add_column(MAC.markers, Gene = row.names(MAC.markers), .before = 1)

temp <- MAC.markers[MAC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".MAC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

Smooth muscle cells

Comparison between the smooth muscle cell communities (ACTA2+), and all other communities.


SMC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("ACTA2+ SMC"), 
                          ident.2 = c("CD68+CASP1+IL1B+SELL MInf", 
                                      "CD68+CD1C+ DC", 
                                      "CD68+CD4+ Mono",
                                      "CD68+IL18+TLR4+TREM2+ MRes",
                                      "CD68+ABCA1+OLR1+TREM2+ FC",
                                      "CD3+ TC I",
                                      "CD3+ TC II", 
                                      "CD3+ TC III", 
                                      "CD3+ TC IV", 
                                      "CD3+ TC V", 
                                      "CD3+ TC VI", 
                                      "FOXP3+ TC", 
                                      "CD34+ EC I", 
                                      "CD34+ EC II",
                                      #"ACTA2+ SMC", 
                                      "CD3+CD56+ NK I",
                                      "CD3+CD56+ NK II", 
                                      "CD68+KIT+ MC",
                                      "CD79+ BCplasma", 
                                      "CD79A+ BCmem"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 29s      
  |++                                                | 2 % ~01m 30s      
  |++                                                | 3 % ~01m 27s      
  |+++                                               | 4 % ~01m 25s      
  |+++                                               | 5 % ~01m 22s      
  |++++                                              | 6 % ~01m 22s      
  |++++                                              | 7 % ~01m 20s      
  |+++++                                             | 8 % ~01m 22s      
  |+++++                                             | 9 % ~01m 20s      
  |++++++                                            | 10% ~01m 21s      
  |++++++                                            | 11% ~01m 21s      
  |+++++++                                           | 12% ~01m 19s      
  |+++++++                                           | 13% ~01m 20s      
  |++++++++                                          | 14% ~01m 19s      
  |++++++++                                          | 15% ~01m 18s      
  |+++++++++                                         | 16% ~01m 18s      
  |+++++++++                                         | 17% ~01m 18s      
  |++++++++++                                        | 18% ~01m 17s      
  |++++++++++                                        | 19% ~01m 15s      
  |+++++++++++                                       | 20% ~01m 14s      
  |+++++++++++                                       | 21% ~01m 13s      
  |++++++++++++                                      | 22% ~01m 11s      
  |++++++++++++                                      | 23% ~01m 10s      
  |+++++++++++++                                     | 24% ~01m 09s      
  |+++++++++++++                                     | 26% ~01m 07s      
  |++++++++++++++                                    | 27% ~01m 08s      
  |++++++++++++++                                    | 28% ~01m 06s      
  |+++++++++++++++                                   | 29% ~01m 05s      
  |+++++++++++++++                                   | 30% ~01m 04s      
  |++++++++++++++++                                  | 31% ~01m 03s      
  |++++++++++++++++                                  | 32% ~01m 02s      
  |+++++++++++++++++                                 | 33% ~01m 02s      
  |+++++++++++++++++                                 | 34% ~01m 01s      
  |++++++++++++++++++                                | 35% ~60s          
  |++++++++++++++++++                                | 36% ~59s          
  |+++++++++++++++++++                               | 37% ~58s          
  |+++++++++++++++++++                               | 38% ~57s          
  |++++++++++++++++++++                              | 39% ~56s          
  |++++++++++++++++++++                              | 40% ~55s          
  |+++++++++++++++++++++                             | 41% ~54s          
  |+++++++++++++++++++++                             | 42% ~53s          
  |++++++++++++++++++++++                            | 43% ~52s          
  |++++++++++++++++++++++                            | 44% ~51s          
  |+++++++++++++++++++++++                           | 45% ~50s          
  |+++++++++++++++++++++++                           | 46% ~49s          
  |++++++++++++++++++++++++                          | 47% ~48s          
  |++++++++++++++++++++++++                          | 48% ~47s          
  |+++++++++++++++++++++++++                         | 49% ~46s          
  |+++++++++++++++++++++++++                         | 50% ~46s          
  |++++++++++++++++++++++++++                        | 51% ~45s          
  |+++++++++++++++++++++++++++                       | 52% ~43s          
  |+++++++++++++++++++++++++++                       | 53% ~43s          
  |++++++++++++++++++++++++++++                      | 54% ~42s          
  |++++++++++++++++++++++++++++                      | 55% ~41s          
  |+++++++++++++++++++++++++++++                     | 56% ~40s          
  |+++++++++++++++++++++++++++++                     | 57% ~39s          
  |++++++++++++++++++++++++++++++                    | 58% ~38s          
  |++++++++++++++++++++++++++++++                    | 59% ~37s          
  |+++++++++++++++++++++++++++++++                   | 60% ~36s          
  |+++++++++++++++++++++++++++++++                   | 61% ~35s          
  |++++++++++++++++++++++++++++++++                  | 62% ~34s          
  |++++++++++++++++++++++++++++++++                  | 63% ~33s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~32s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~31s          
  |++++++++++++++++++++++++++++++++++                | 66% ~30s          
  |++++++++++++++++++++++++++++++++++                | 67% ~29s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~29s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~28s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~27s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~26s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~25s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~24s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~23s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~22s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~21s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~20s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~19s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~18s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~17s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~17s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~16s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~15s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~14s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~13s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~12s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~11s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01m 29s
DT::datatable(SMC.markers)
SMC_Volcano_TargetsA = EnhancedVolcano(SMC.markers,
    lab = rownames(SMC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "SMC markers\n(SMC communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/(nrow(SMC.markers)), # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
SMC_Volcano_TargetsA

ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.SMC.DEG.Targets.pdf"), 
       plot = SMC_Volcano_TargetsA)
Saving 18 x 12 in image

The target results are given below and written to a file.

library(tibble)
SMC.markers <- add_column(SMC.markers, Gene = row.names(SMC.markers), .before = 1)

temp <- SMC.markers[SMC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".SMC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

Endothelial cells

Comparison between the endothelial cell communities (CD34+), and all other communities.


EC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("CD34+ EC I", 
                                      "CD34+ EC II"), 
                          ident.2 = c("CD68+CASP1+IL1B+SELL MInf", 
                                      "CD68+CD1C+ DC", 
                                      "CD68+CD4+ Mono",
                                      "CD68+IL18+TLR4+TREM2+ MRes",
                                      "CD68+ABCA1+OLR1+TREM2+ FC",
                                      "CD3+ TC I",
                                      "CD3+ TC II", 
                                      "CD3+ TC III", 
                                      "CD3+ TC IV", 
                                      "CD3+ TC V", 
                                      "CD3+ TC VI", 
                                      "FOXP3+ TC", 
                                      # "CD34+ EC I", 
                                      # "CD34+ EC II",
                                      "ACTA2+ SMC", 
                                      "CD3+CD56+ NK I",
                                      "CD3+CD56+ NK II", 
                                      "CD68+KIT+ MC",
                                      "CD79+ BCplasma", 
                                      "CD79A+ BCmem"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 33s      
  |++                                                | 2 % ~01m 28s      
  |++                                                | 3 % ~01m 21s      
  |+++                                               | 4 % ~01m 16s      
  |+++                                               | 5 % ~01m 16s      
  |++++                                              | 6 % ~01m 16s      
  |++++                                              | 7 % ~01m 14s      
  |+++++                                             | 8 % ~01m 12s      
  |+++++                                             | 9 % ~01m 11s      
  |++++++                                            | 10% ~01m 11s      
  |++++++                                            | 11% ~01m 10s      
  |+++++++                                           | 12% ~01m 09s      
  |+++++++                                           | 13% ~01m 08s      
  |++++++++                                          | 14% ~01m 08s      
  |++++++++                                          | 15% ~01m 06s      
  |+++++++++                                         | 16% ~01m 05s      
  |+++++++++                                         | 17% ~01m 05s      
  |++++++++++                                        | 18% ~01m 04s      
  |++++++++++                                        | 19% ~01m 03s      
  |+++++++++++                                       | 20% ~01m 02s      
  |+++++++++++                                       | 21% ~01m 02s      
  |++++++++++++                                      | 22% ~01m 01s      
  |++++++++++++                                      | 23% ~60s          
  |+++++++++++++                                     | 24% ~59s          
  |+++++++++++++                                     | 25% ~58s          
  |++++++++++++++                                    | 26% ~58s          
  |++++++++++++++                                    | 27% ~57s          
  |+++++++++++++++                                   | 28% ~55s          
  |+++++++++++++++                                   | 29% ~55s          
  |++++++++++++++++                                  | 30% ~54s          
  |++++++++++++++++                                  | 31% ~53s          
  |+++++++++++++++++                                 | 32% ~52s          
  |+++++++++++++++++                                 | 33% ~52s          
  |++++++++++++++++++                                | 34% ~51s          
  |++++++++++++++++++                                | 35% ~50s          
  |+++++++++++++++++++                               | 36% ~49s          
  |+++++++++++++++++++                               | 37% ~48s          
  |++++++++++++++++++++                              | 38% ~48s          
  |++++++++++++++++++++                              | 39% ~47s          
  |+++++++++++++++++++++                             | 40% ~46s          
  |+++++++++++++++++++++                             | 41% ~45s          
  |++++++++++++++++++++++                            | 42% ~45s          
  |++++++++++++++++++++++                            | 43% ~44s          
  |+++++++++++++++++++++++                           | 44% ~43s          
  |+++++++++++++++++++++++                           | 45% ~42s          
  |++++++++++++++++++++++++                          | 46% ~41s          
  |++++++++++++++++++++++++                          | 47% ~41s          
  |+++++++++++++++++++++++++                         | 48% ~40s          
  |+++++++++++++++++++++++++                         | 49% ~39s          
  |++++++++++++++++++++++++++                        | 51% ~38s          
  |++++++++++++++++++++++++++                        | 52% ~37s          
  |+++++++++++++++++++++++++++                       | 53% ~36s          
  |+++++++++++++++++++++++++++                       | 54% ~36s          
  |++++++++++++++++++++++++++++                      | 55% ~35s          
  |++++++++++++++++++++++++++++                      | 56% ~34s          
  |+++++++++++++++++++++++++++++                     | 57% ~33s          
  |+++++++++++++++++++++++++++++                     | 58% ~33s          
  |++++++++++++++++++++++++++++++                    | 59% ~32s          
  |++++++++++++++++++++++++++++++                    | 60% ~31s          
  |+++++++++++++++++++++++++++++++                   | 61% ~30s          
  |+++++++++++++++++++++++++++++++                   | 62% ~29s          
  |++++++++++++++++++++++++++++++++                  | 63% ~29s          
  |++++++++++++++++++++++++++++++++                  | 64% ~28s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~27s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~26s          
  |++++++++++++++++++++++++++++++++++                | 67% ~26s          
  |++++++++++++++++++++++++++++++++++                | 68% ~25s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~24s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~23s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~23s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~22s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~21s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~20s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~19s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~19s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~18s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~17s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~16s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~16s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~15s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~14s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~13s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~12s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~12s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~11s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01m 15s
DT::datatable(EC.markers)
EC_Volcano_TargetsA = EnhancedVolcano(EC.markers,
    lab = rownames(EC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "Endothelial cell markers\n(EC communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/(nrow(EC.markers)), # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
EC_Volcano_TargetsA

ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.EC.DEG.Targets.pdf"), 
       plot = EC_Volcano_TargetsA)
Saving 18 x 12 in image

The target results are given below and written to a file.

library(tibble)
EC.markers <- add_column(EC.markers, Gene = row.names(EC.markers), .before = 1)

temp <- EC.markers[EC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".EC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

T-cells

Comparison between the T-cell communities (CD3/CD4/CD8+), and all other communities.


TC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("CD3+ TC I",
                                      "CD3+ TC II", 
                                      "CD3+ TC III", 
                                      "CD3+ TC IV", 
                                      "CD3+ TC V", 
                                      "CD3+ TC VI", 
                                      "FOXP3+ TC"), 
                          ident.2 = c("CD68+CASP1+IL1B+SELL MInf", 
                                      "CD68+CD1C+ DC", 
                                      "CD68+CD4+ Mono",
                                      "CD68+IL18+TLR4+TREM2+ MRes",
                                      "CD68+ABCA1+OLR1+TREM2+ FC",
                                      # "CD3+ TC I",
                                      # "CD3+ TC II", 
                                      # "CD3+ TC III", 
                                      # "CD3+ TC IV", 
                                      # "CD3+ TC V", 
                                      # "CD3+ TC VI", 
                                      # "FOXP3+ TC", 
                                      "CD34+ EC I", 
                                      "CD34+ EC II",
                                      "ACTA2+ SMC", 
                                      "CD3+CD56+ NK I",
                                      "CD3+CD56+ NK II", 
                                      "CD68+KIT+ MC",
                                      "CD79+ BCplasma", 
                                      "CD79A+ BCmem"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~54s          
  |++                                                | 2 % ~54s          
  |++                                                | 3 % ~54s          
  |+++                                               | 4 % ~56s          
  |+++                                               | 5 % ~54s          
  |++++                                              | 6 % ~52s          
  |++++                                              | 7 % ~50s          
  |+++++                                             | 8 % ~51s          
  |+++++                                             | 9 % ~51s          
  |++++++                                            | 10% ~50s          
  |++++++                                            | 11% ~49s          
  |+++++++                                           | 12% ~48s          
  |+++++++                                           | 13% ~47s          
  |++++++++                                          | 14% ~47s          
  |++++++++                                          | 15% ~47s          
  |+++++++++                                         | 16% ~46s          
  |+++++++++                                         | 17% ~45s          
  |++++++++++                                        | 18% ~45s          
  |++++++++++                                        | 19% ~45s          
  |+++++++++++                                       | 20% ~44s          
  |+++++++++++                                       | 21% ~44s          
  |++++++++++++                                      | 22% ~43s          
  |++++++++++++                                      | 23% ~42s          
  |+++++++++++++                                     | 24% ~41s          
  |+++++++++++++                                     | 26% ~41s          
  |++++++++++++++                                    | 27% ~40s          
  |++++++++++++++                                    | 28% ~40s          
  |+++++++++++++++                                   | 29% ~39s          
  |+++++++++++++++                                   | 30% ~38s          
  |++++++++++++++++                                  | 31% ~38s          
  |++++++++++++++++                                  | 32% ~37s          
  |+++++++++++++++++                                 | 33% ~37s          
  |+++++++++++++++++                                 | 34% ~36s          
  |++++++++++++++++++                                | 35% ~36s          
  |++++++++++++++++++                                | 36% ~35s          
  |+++++++++++++++++++                               | 37% ~35s          
  |+++++++++++++++++++                               | 38% ~34s          
  |++++++++++++++++++++                              | 39% ~34s          
  |++++++++++++++++++++                              | 40% ~33s          
  |+++++++++++++++++++++                             | 41% ~32s          
  |+++++++++++++++++++++                             | 42% ~01h 23m 58s  
  |++++++++++++++++++++++                            | 43% ~01h 20m 36s  
  |++++++++++++++++++++++                            | 44% ~01h 17m 23s  
  |+++++++++++++++++++++++                           | 45% ~01h 14m 16s  
  |+++++++++++++++++++++++                           | 46% ~01h 11m 17s  
  |++++++++++++++++++++++++                          | 47% ~01h 08m 26s  
  |++++++++++++++++++++++++                          | 48% ~01h 05m 43s  
  |+++++++++++++++++++++++++                         | 49% ~01h 03m 06s  
  |+++++++++++++++++++++++++                         | 50% ~01h 00m 35s  
  |++++++++++++++++++++++++++                        | 51% ~58m 10s      
  |+++++++++++++++++++++++++++                       | 52% ~55m 52s      
  |+++++++++++++++++++++++++++                       | 53% ~53m 38s      
  |++++++++++++++++++++++++++++                      | 54% ~51m 29s      
  |++++++++++++++++++++++++++++                      | 55% ~49m 25s      
  |+++++++++++++++++++++++++++++                     | 56% ~47m 26s      
  |+++++++++++++++++++++++++++++                     | 57% ~45m 31s      
  |++++++++++++++++++++++++++++++                    | 58% ~43m 39s      
  |++++++++++++++++++++++++++++++                    | 59% ~41m 52s      
  |+++++++++++++++++++++++++++++++                   | 60% ~40m 08s      
  |+++++++++++++++++++++++++++++++                   | 61% ~38m 28s      
  |++++++++++++++++++++++++++++++++                  | 62% ~36m 51s      
  |++++++++++++++++++++++++++++++++                  | 63% ~35m 17s      
  |+++++++++++++++++++++++++++++++++                 | 64% ~33m 45s      
  |+++++++++++++++++++++++++++++++++                 | 65% ~32m 17s      
  |++++++++++++++++++++++++++++++++++                | 66% ~30m 52s      
  |++++++++++++++++++++++++++++++++++                | 67% ~29m 29s      
  |+++++++++++++++++++++++++++++++++++               | 68% ~28m 08s      
  |+++++++++++++++++++++++++++++++++++               | 69% ~26m 50s      
  |++++++++++++++++++++++++++++++++++++              | 70% ~25m 34s      
  |++++++++++++++++++++++++++++++++++++              | 71% ~24m 20s      
  |+++++++++++++++++++++++++++++++++++++             | 72% ~23m 08s      
  |+++++++++++++++++++++++++++++++++++++             | 73% ~21m 58s      
  |++++++++++++++++++++++++++++++++++++++            | 74% ~20m 50s      
  |++++++++++++++++++++++++++++++++++++++            | 76% ~19m 44s      
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~18m 40s      
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~17m 37s      
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~16m 36s      
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~15m 37s      
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~14m 39s      
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~13m 42s      
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~12m 47s      
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~11m 53s      
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~11m 01s      
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~10m 09s      
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~09m 19s      
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~08m 30s      
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~07m 43s      
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~06m 56s      
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~06m 10s      
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~05m 25s      
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~04m 42s      
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~03m 59s      
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~03m 17s      
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~02m 36s      
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01m 56s      
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01m 16s      
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~38s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01h 01m 04s
DT::datatable(TC.markers)
TC_Volcano_TargetsA = EnhancedVolcano(TC.markers,
    lab = rownames(TC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "T-cell markers\n(T-cell communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/nrow(TC.markers), # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
TC_Volcano_TargetsA

ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.TC.DEG.Targets.pdf"), 
       plot = TC_Volcano_TargetsA)
Saving 18 x 12 in image

The target results are given below and written to a file.

library(tibble)
TC.markers <- add_column(TC.markers, Gene = row.names(TC.markers), .before = 1)

temp <- TC.markers[TC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".TC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

B-cells

Comparison between the B-cell communities (CD79A+), and all other communities.


BC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("CD79+ BCplasma", 
                                      "CD79A+ BCmem"), 
                          ident.2 = c("CD68+CASP1+IL1B+SELL MInf", 
                                      "CD68+CD1C+ DC", 
                                      "CD68+CD4+ Mono",
                                      "CD68+IL18+TLR4+TREM2+ MRes",
                                      "CD68+ABCA1+OLR1+TREM2+ FC",
                                      "CD3+ TC I",
                                      "CD3+ TC II", 
                                      "CD3+ TC III", 
                                      "CD3+ TC IV", 
                                      "CD3+ TC V", 
                                      "CD3+ TC VI", 
                                      "FOXP3+ TC", 
                                      "CD34+ EC I", 
                                      "CD34+ EC II",
                                      "ACTA2+ SMC", 
                                      "CD3+CD56+ NK I",
                                      "CD3+CD56+ NK II", 
                                      "CD68+KIT+ MC"
                                      # "CD79+ BCplasma", 
                                      # "CD79A+ BCmem"
                                      ))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~54s          
  |+                                                 | 2 % ~48s          
  |++                                                | 3 % ~46s          
  |++                                                | 4 % ~44s          
  |+++                                               | 5 % ~43s          
  |+++                                               | 6 % ~45s          
  |++++                                              | 7 % ~44s          
  |++++                                              | 8 % ~43s          
  |+++++                                             | 9 % ~42s          
  |+++++                                             | 10% ~41s          
  |++++++                                            | 11% ~40s          
  |++++++                                            | 12% ~40s          
  |+++++++                                           | 13% ~39s          
  |+++++++                                           | 14% ~39s          
  |++++++++                                          | 15% ~38s          
  |++++++++                                          | 16% ~38s          
  |+++++++++                                         | 17% ~37s          
  |+++++++++                                         | 18% ~37s          
  |++++++++++                                        | 19% ~36s          
  |++++++++++                                        | 20% ~36s          
  |+++++++++++                                       | 21% ~35s          
  |+++++++++++                                       | 22% ~34s          
  |++++++++++++                                      | 23% ~42s          
  |++++++++++++                                      | 24% ~41s          
  |+++++++++++++                                     | 25% ~40s          
  |+++++++++++++                                     | 26% ~39s          
  |++++++++++++++                                    | 27% ~38s          
  |++++++++++++++                                    | 28% ~38s          
  |+++++++++++++++                                   | 29% ~37s          
  |+++++++++++++++                                   | 30% ~36s          
  |++++++++++++++++                                  | 31% ~35s          
  |++++++++++++++++                                  | 32% ~35s          
  |+++++++++++++++++                                 | 33% ~34s          
  |+++++++++++++++++                                 | 34% ~33s          
  |++++++++++++++++++                                | 35% ~33s          
  |++++++++++++++++++                                | 36% ~32s          
  |+++++++++++++++++++                               | 37% ~31s          
  |+++++++++++++++++++                               | 38% ~31s          
  |++++++++++++++++++++                              | 39% ~30s          
  |++++++++++++++++++++                              | 40% ~30s          
  |+++++++++++++++++++++                             | 41% ~29s          
  |+++++++++++++++++++++                             | 42% ~28s          
  |++++++++++++++++++++++                            | 43% ~28s          
  |++++++++++++++++++++++                            | 44% ~27s          
  |+++++++++++++++++++++++                           | 45% ~25m 17s      
  |+++++++++++++++++++++++                           | 46% ~24m 19s      
  |++++++++++++++++++++++++                          | 47% ~23m 23s      
  |++++++++++++++++++++++++                          | 48% ~22m 29s      
  |+++++++++++++++++++++++++                         | 49% ~21m 37s      
  |+++++++++++++++++++++++++                         | 50% ~20m 47s      
  |++++++++++++++++++++++++++                        | 51% ~19m 58s      
  |++++++++++++++++++++++++++                        | 52% ~19m 12s      
  |+++++++++++++++++++++++++++                       | 53% ~18m 27s      
  |+++++++++++++++++++++++++++                       | 54% ~17m 44s      
  |++++++++++++++++++++++++++++                      | 55% ~17m 02s      
  |++++++++++++++++++++++++++++                      | 56% ~16m 22s      
  |+++++++++++++++++++++++++++++                     | 57% ~15m 44s      
  |+++++++++++++++++++++++++++++                     | 58% ~15m 06s      
  |++++++++++++++++++++++++++++++                    | 59% ~14m 30s      
  |++++++++++++++++++++++++++++++                    | 60% ~13m 55s      
  |+++++++++++++++++++++++++++++++                   | 61% ~13m 21s      
  |+++++++++++++++++++++++++++++++                   | 62% ~12m 48s      
  |++++++++++++++++++++++++++++++++                  | 63% ~12m 16s      
  |++++++++++++++++++++++++++++++++                  | 64% ~11m 46s      
  |+++++++++++++++++++++++++++++++++                 | 65% ~11m 16s      
  |+++++++++++++++++++++++++++++++++                 | 66% ~10m 47s      
  |++++++++++++++++++++++++++++++++++                | 67% ~10m 19s      
  |++++++++++++++++++++++++++++++++++                | 68% ~09m 51s      
  |+++++++++++++++++++++++++++++++++++               | 69% ~09m 25s      
  |+++++++++++++++++++++++++++++++++++               | 70% ~08m 59s      
  |++++++++++++++++++++++++++++++++++++              | 71% ~08m 34s      
  |++++++++++++++++++++++++++++++++++++              | 72% ~08m 10s      
  |+++++++++++++++++++++++++++++++++++++             | 73% ~07m 46s      
  |+++++++++++++++++++++++++++++++++++++             | 74% ~07m 23s      
  |++++++++++++++++++++++++++++++++++++++            | 75% ~07m 00s      
  |++++++++++++++++++++++++++++++++++++++            | 76% ~06m 38s      
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~06m 17s      
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~05m 56s      
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~05m 36s      
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~05m 16s      
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~04m 56s      
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~04m 37s      
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~04m 19s      
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~04m 01s      
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03m 43s      
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~03m 26s      
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~03m 09s      
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02m 53s      
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02m 37s      
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02m 21s      
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02m 06s      
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01m 50s      
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01m 36s      
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01m 21s      
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01m 07s      
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~53s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~39s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~26s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~13s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=21m 14s
DT::datatable(BC.markers)
BC_Volcano_TargetsA = EnhancedVolcano(BC.markers,
    lab = rownames(BC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "B-cell markers\n(B-cell communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/nrow(BC.markers), # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
BC_Volcano_TargetsA

ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.BC.DEG.Targets.pdf"), 
       plot = BC_Volcano_TargetsA)
Saving 18 x 12 in image

The target results are given below and written to a file.

library(tibble)
BC.markers <- add_column(BC.markers, Gene = row.names(BC.markers), .before = 1)

temp <- BC.markers[BC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".BC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

Mast cells

Comparison between the mast cell communities (KIT+), and all other communities.


MC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("CD68+KIT+ MC"), 
                          ident.2 = c("CD68+CASP1+IL1B+SELL MInf", 
                                      "CD68+CD1C+ DC", 
                                      "CD68+CD4+ Mono",
                                      "CD68+IL18+TLR4+TREM2+ MRes",
                                      "CD68+ABCA1+OLR1+TREM2+ FC",
                                      "CD3+ TC I",
                                      "CD3+ TC II", 
                                      "CD3+ TC III", 
                                      "CD3+ TC IV", 
                                      "CD3+ TC V", 
                                      "CD3+ TC VI", 
                                      "FOXP3+ TC", 
                                      "CD34+ EC I", 
                                      "CD34+ EC II",
                                      "ACTA2+ SMC", 
                                      "CD3+CD56+ NK I",
                                      "CD3+CD56+ NK II", 
                                      # "CD68+KIT+ MC",
                                      "CD79+ BCplasma", 
                                      "CD79A+ BCmem"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 12s      
  |+                                                 | 2 % ~01m 38s      
  |++                                                | 3 % ~01m 31s      
  |++                                                | 4 % ~01m 24s      
  |+++                                               | 5 % ~01m 21s      
  |+++                                               | 6 % ~01m 20s      
  |++++                                              | 7 % ~01m 19s      
  |++++                                              | 8 % ~01m 16s      
  |+++++                                             | 9 % ~01m 14s      
  |+++++                                             | 10% ~01m 13s      
  |++++++                                            | 11% ~01m 13s      
  |++++++                                            | 12% ~01m 11s      
  |+++++++                                           | 13% ~01m 10s      
  |+++++++                                           | 14% ~01m 09s      
  |++++++++                                          | 15% ~01m 09s      
  |++++++++                                          | 16% ~01m 07s      
  |+++++++++                                         | 17% ~01m 06s      
  |+++++++++                                         | 18% ~01m 06s      
  |++++++++++                                        | 19% ~01m 05s      
  |++++++++++                                        | 20% ~01m 04s      
  |+++++++++++                                       | 21% ~01m 03s      
  |+++++++++++                                       | 22% ~01m 02s      
  |++++++++++++                                      | 23% ~01m 02s      
  |++++++++++++                                      | 24% ~01m 00s      
  |+++++++++++++                                     | 25% ~01m 00s      
  |+++++++++++++                                     | 26% ~59s          
  |++++++++++++++                                    | 27% ~59s          
  |++++++++++++++                                    | 28% ~57s          
  |+++++++++++++++                                   | 29% ~57s          
  |+++++++++++++++                                   | 30% ~56s          
  |++++++++++++++++                                  | 31% ~55s          
  |++++++++++++++++                                  | 32% ~54s          
  |+++++++++++++++++                                 | 33% ~53s          
  |+++++++++++++++++                                 | 34% ~53s          
  |++++++++++++++++++                                | 35% ~52s          
  |++++++++++++++++++                                | 36% ~51s          
  |+++++++++++++++++++                               | 37% ~50s          
  |+++++++++++++++++++                               | 38% ~49s          
  |++++++++++++++++++++                              | 39% ~49s          
  |++++++++++++++++++++                              | 40% ~48s          
  |+++++++++++++++++++++                             | 41% ~47s          
  |+++++++++++++++++++++                             | 42% ~46s          
  |++++++++++++++++++++++                            | 43% ~45s          
  |++++++++++++++++++++++                            | 44% ~44s          
  |+++++++++++++++++++++++                           | 45% ~43s          
  |+++++++++++++++++++++++                           | 46% ~43s          
  |++++++++++++++++++++++++                          | 47% ~42s          
  |++++++++++++++++++++++++                          | 48% ~41s          
  |+++++++++++++++++++++++++                         | 49% ~40s          
  |+++++++++++++++++++++++++                         | 50% ~40s          
  |++++++++++++++++++++++++++                        | 51% ~39s          
  |++++++++++++++++++++++++++                        | 52% ~38s          
  |+++++++++++++++++++++++++++                       | 53% ~37s          
  |+++++++++++++++++++++++++++                       | 54% ~36s          
  |++++++++++++++++++++++++++++                      | 55% ~35s          
  |++++++++++++++++++++++++++++                      | 56% ~35s          
  |+++++++++++++++++++++++++++++                     | 57% ~34s          
  |+++++++++++++++++++++++++++++                     | 58% ~33s          
  |++++++++++++++++++++++++++++++                    | 59% ~32s          
  |++++++++++++++++++++++++++++++                    | 60% ~31s          
  |+++++++++++++++++++++++++++++++                   | 61% ~31s          
  |+++++++++++++++++++++++++++++++                   | 62% ~30s          
  |++++++++++++++++++++++++++++++++                  | 63% ~29s          
  |++++++++++++++++++++++++++++++++                  | 64% ~28s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~27s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~27s          
  |++++++++++++++++++++++++++++++++++                | 67% ~26s          
  |++++++++++++++++++++++++++++++++++                | 68% ~25s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~24s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~23s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~23s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~22s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~21s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~20s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~20s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~19s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~18s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~17s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~16s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~16s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~15s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~14s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~13s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~13s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~12s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~11s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01m 17s
DT::datatable(MC.markers)
MC_Volcano_TargetsA = EnhancedVolcano(MC.markers,
    lab = rownames(MC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "Mast cell markers\n(Mast cell communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/nrow(MC.markers), # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
MC_Volcano_TargetsA

ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.MC.DEG.Targets.pdf"), 
       plot = MC_Volcano_TargetsA)
Saving 18 x 12 in image

The target results are given below and written to a file.

library(tibble)
MC.markers <- add_column(MC.markers, Gene = row.names(MC.markers), .before = 1)

temp <- MC.markers[MC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".MC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

NK-cells

Comparison between the natural killer cell communities (NCAM1+), and all other communities.


NK.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("CD3+CD56+ NK I",
                                      "CD3+CD56+ NK II"), 
                          ident.2 = c("CD68+CASP1+IL1B+SELL MInf", 
                                      "CD68+CD1C+ DC", 
                                      "CD68+CD4+ Mono",
                                      "CD68+IL18+TLR4+TREM2+ MRes",
                                      "CD68+ABCA1+OLR1+TREM2+ FC",
                                      "CD3+ TC I",
                                      "CD3+ TC II", 
                                      "CD3+ TC III", 
                                      "CD3+ TC IV", 
                                      "CD3+ TC V", 
                                      "CD3+ TC VI", 
                                      "FOXP3+ TC", 
                                      "CD34+ EC I", 
                                      "CD34+ EC II",
                                      "ACTA2+ SMC", 
                                      # "CD3+CD56+ NK I",
                                      # "CD3+CD56+ NK II", 
                                      "CD68+KIT+ MC",
                                      "CD79+ BCplasma", 
                                      "CD79A+ BCmem"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~28s          
  |++                                                | 2 % ~26s          
  |++                                                | 3 % ~28s          
  |+++                                               | 4 % ~29s          
  |+++                                               | 5 % ~29s          
  |++++                                              | 6 % ~29s          
  |++++                                              | 7 % ~29s          
  |+++++                                             | 8 % ~28s          
  |+++++                                             | 9 % ~30s          
  |++++++                                            | 10% ~29s          
  |++++++                                            | 11% ~28s          
  |+++++++                                           | 12% ~27s          
  |+++++++                                           | 13% ~27s          
  |++++++++                                          | 14% ~27s          
  |++++++++                                          | 15% ~26s          
  |+++++++++                                         | 16% ~26s          
  |+++++++++                                         | 18% ~25s          
  |++++++++++                                        | 19% ~25s          
  |++++++++++                                        | 20% ~25s          
  |+++++++++++                                       | 21% ~24s          
  |+++++++++++                                       | 22% ~24s          
  |++++++++++++                                      | 23% ~23s          
  |++++++++++++                                      | 24% ~23s          
  |+++++++++++++                                     | 25% ~23s          
  |+++++++++++++                                     | 26% ~22s          
  |++++++++++++++                                    | 27% ~22s          
  |++++++++++++++                                    | 28% ~22s          
  |+++++++++++++++                                   | 29% ~21s          
  |+++++++++++++++                                   | 30% ~21s          
  |++++++++++++++++                                  | 31% ~21s          
  |++++++++++++++++                                  | 32% ~20s          
  |+++++++++++++++++                                 | 33% ~20s          
  |++++++++++++++++++                                | 34% ~20s          
  |++++++++++++++++++                                | 35% ~19s          
  |+++++++++++++++++++                               | 36% ~19s          
  |+++++++++++++++++++                               | 37% ~19s          
  |++++++++++++++++++++                              | 38% ~19s          
  |++++++++++++++++++++                              | 39% ~18s          
  |+++++++++++++++++++++                             | 40% ~18s          
  |+++++++++++++++++++++                             | 41% ~18s          
  |++++++++++++++++++++++                            | 42% ~17s          
  |++++++++++++++++++++++                            | 43% ~17s          
  |+++++++++++++++++++++++                           | 44% ~17s          
  |+++++++++++++++++++++++                           | 45% ~16s          
  |++++++++++++++++++++++++                          | 46% ~16s          
  |++++++++++++++++++++++++                          | 47% ~16s          
  |+++++++++++++++++++++++++                         | 48% ~15s          
  |+++++++++++++++++++++++++                         | 49% ~15s          
  |++++++++++++++++++++++++++                        | 51% ~15s          
  |++++++++++++++++++++++++++                        | 52% ~15s          
  |+++++++++++++++++++++++++++                       | 53% ~14s          
  |+++++++++++++++++++++++++++                       | 54% ~14s          
  |++++++++++++++++++++++++++++                      | 55% ~13s          
  |++++++++++++++++++++++++++++                      | 56% ~13s          
  |+++++++++++++++++++++++++++++                     | 57% ~13s          
  |+++++++++++++++++++++++++++++                     | 58% ~13s          
  |++++++++++++++++++++++++++++++                    | 59% ~12s          
  |++++++++++++++++++++++++++++++                    | 60% ~12s          
  |+++++++++++++++++++++++++++++++                   | 61% ~12s          
  |+++++++++++++++++++++++++++++++                   | 62% ~12s          
  |++++++++++++++++++++++++++++++++                  | 63% ~11s          
  |++++++++++++++++++++++++++++++++                  | 64% ~11s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~11s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~11s          
  |++++++++++++++++++++++++++++++++++                | 67% ~11s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~10s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~10s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~10s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~09s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~09s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~09s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~08s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~08s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~08s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~07s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~07s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=31s  
DT::datatable(NK.markers)
NK_Volcano_TargetsA = EnhancedVolcano(NK.markers,
    lab = rownames(NK.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "NK markers\n(NK-cell communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/nrow(NK.markers), # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
NK_Volcano_TargetsA

ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.NK.DEG.Targets.pdf"), 
       plot = NK_Volcano_TargetsA)
Saving 18 x 12 in image

The target results are given below and written to a file.

library(tibble)
NK.markers <- add_column(NK.markers, Gene = row.names(NK.markers), .before = 1)

temp <- NK.markers[NK.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".NK.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

Subset scRNAseq data

List of samples to be included based on informed consent (see above).

samples_of_interest <- unlist(scRNAseqDataMetaAE.all$Patient)
scRNAseqDataCEA39 <- subset(scRNAseqData, subset = Patient %in% samples_of_interest)
variables_of_interest <- c("Hospital", "ORyear", "Artery_summary",
                           "Age", "Gender",
                           "TC_final", "LDL_final", "HDL_final", "TG_final",
                           "systolic", "diastoli", "GFR_MDRD", "BMI",
                           "KDOQI", "BMI_WHO",
                           "SmokerStatus", "AlcoholUse",
                           "DiabetesStatus",
                           "Hypertension.selfreport", "Hypertension.selfreportdrug", "Hypertension.composite", "Hypertension.drugs",
                           "Med.anticoagulants", "Med.all.antiplatelet", "Med.Statin.LLD",
                           "Stroke_Dx",
                           "sympt", "Symptoms.5G", "AsymptSympt", "AsymptSympt2G",
                           "Symptoms.Update2G", "Symptoms.Update3G", "indexsymptoms_latest_4g",
                           "restenos", "stenose",
                           "CAD_history", "PAOD", "Peripheral.interv",
                           "EP_composite", "EP_composite_time", "EP_major", "EP_major_time")

temp <- subset(scRNAseqDataMetaAE.all, select = c("Patient", variables_of_interest))
# str(temp)
scRNAseqDataCEA39@meta.data <- merge(scRNAseqDataCEA39@meta.data, temp, by.x = "Patient", by.y = "Patient")
scRNAseqDataCEA39@meta.data <- dplyr::rename(scRNAseqDataCEA39@meta.data, "STUDY_NUMBER" = "Patient")

# str(scRNAseqDataCEA39@meta.data)

Saving new dataset

temp2 <- as_tibble(subset(scRNAseqDataCEA39@meta.data, select = c("STUDY_NUMBER", "orig.ident", "nCount_RNA", "nFeature_RNA",
                                                                 "Plate", "Batch", "C.H", "Type", "percent.mt",
                                                                 "nCount_SCT", "nFeature_SCT", "seurat_clusters")))

# fwrite(temp2,
#        file = paste0(OUT_loc, "/", Today, ".AESCRNA.CEA.39pts.samplelist.after_qc.IC_commercial.csv"),
#        sep = ",", row.names = FALSE, col.names = TRUE,
#        showProgress = TRUE)
# rm(temp2)
# 
# temp <- dplyr::rename(temp, "STUDY_NUMBER" = "Patient")
# fwrite(temp,
#        file = paste0(OUT_loc, "/", Today, ".AESCRNA.CEA.39pts.clinicaldata.after_qc.IC_commercial.csv"),
#        sep = ",", row.names = FALSE, col.names = TRUE,
#        showProgress = TRUE)
# rm(temp)
# 
# saveRDS(scRNAseqDataCEA39, file = paste0(OUT_loc, "/", Today, ".AESCRNA.CEA.39pts.Seurat.after_qc.IC_commercial.RDS"))

fwrite(temp2,
       file = paste0(OUT_loc, "/", Today, ".AESCRNA.CEA.39pts.samplelist.after_qc.IC_academic.csv"),
       sep = ",", row.names = FALSE, col.names = TRUE,
       showProgress = TRUE)
rm(temp2)

temp <- dplyr::rename(temp, "STUDY_NUMBER" = "Patient")
fwrite(temp,
       file = paste0(OUT_loc, "/", Today, ".AESCRNA.CEA.39pts.clinicaldata.after_qc.IC_academic.csv"),
       sep = ",", row.names = FALSE, col.names = TRUE,
       showProgress = TRUE)
rm(temp)

saveRDS(scRNAseqDataCEA39, file = paste0(OUT_loc, "/", Today, ".AESCRNA.CEA.39pts.Seurat.after_qc.IC_academic.RDS"))

Session information


Version:      v1.0.1
Last update:  2022-03-19
Written by:   Sander W. van der Laan (s.w.vanderlaan-2[at]umcutrecht.nl).
Description:  Script to load single-cell RNA sequencing (scRNAseq) data, and perform quality control (QC), and initial mapping to cells.
Minimum requirements: R version 3.5.2 (2018-12-20) -- 'Eggshell Igloo', macOS Mojave (10.14.2).

**MoSCoW To-Do List**
The things we Must, Should, Could, and Would have given the time we have.
_M_

_S_

_C_

_W_

**Changes log**
* v1.0.1 Update to main AEDB (there is an error in the Age-variable in the new version). Fewer patients in scRNAseq (32 vs 39 with the newer dataset).
* v1.0.0 Initial version.

sessionInfo()
R version 4.1.2 (2021-11-01)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Monterey 12.2.1

Matrix products: default
LAPACK: /Library/Frameworks/R.framework/Versions/4.1/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
 [1] stats4    grid      tools     stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] RColorBrewer_1.1-2                      SeuratObject_4.0.4                      Seurat_4.0.6                           
 [4] PerformanceAnalytics_2.0.4              xts_0.12.1                              zoo_1.8-9                              
 [7] Hmisc_4.6-0                             Formula_1.2-4                           lattice_0.20-45                        
[10] survminer_0.4.9                         survival_3.3-1                          MASS_7.3-54                            
[13] ggcorrplot_0.1.3.999                    GGally_2.1.2                            annotables_0.1.91                      
[16] EnhancedVolcano_1.12.0                  ggrepel_0.9.1                           AnnotationFilter_1.18.0                
[19] TxDb.Hsapiens.UCSC.hg19.knownGene_3.2.2 mygene_1.30.0                           org.Hs.eg.db_3.14.0                    
[22] DESeq2_1.34.0                           SummarizedExperiment_1.24.0             MatrixGenerics_1.6.0                   
[25] matrixStats_0.61.0                      GenomicFeatures_1.46.3                  AnnotationDbi_1.56.2                   
[28] Biobase_2.54.0                          GenomicRanges_1.46.1                    GenomeInfoDb_1.30.0                    
[31] IRanges_2.28.0                          S4Vectors_0.32.3                        BiocGenerics_0.40.0                    
[34] patchwork_1.1.0.9000                    labelled_2.9.0                          openxlsx_4.2.5                         
[37] sjPlot_2.8.10                           UpSetR_1.4.0                            ggpubr_0.4.0                           
[40] forestplot_2.0.1                        checkmate_2.0.0                         magrittr_2.0.2                         
[43] pheatmap_1.0.12                         devtools_2.4.3                          usethis_2.1.5                          
[46] BlandAltmanLeh_0.3.1                    tableone_0.13.0                         haven_2.4.3                            
[49] eeptools_1.2.4                          DT_0.20                                 knitr_1.37                             
[52] forcats_0.5.1                           stringr_1.4.0                           purrr_0.3.4                            
[55] tibble_3.1.6                            ggplot2_3.3.5                           tidyverse_1.3.1                        
[58] data.table_1.14.2                       naniar_0.6.1                            tidyr_1.1.4                            
[61] dplyr_1.0.7                             optparse_1.7.1                          readr_2.1.1                            
[64] pander_0.6.4                            rmarkdown_2.11                          worcs_0.1.9.1                          

loaded via a namespace (and not attached):
  [1] mitools_2.4              pbapply_1.5-0            vctrs_0.3.8              mgcv_1.8-39              blob_1.2.2               spatstat.data_2.1-2     
  [7] later_1.3.0              nloptr_1.2.2.3           DBI_1.1.2                uwot_0.1.11              rappdirs_0.3.3           gsubfn_0.7              
 [13] jpeg_0.1-9               zlibbioc_1.40.0          sjmisc_2.8.9             htmlwidgets_1.5.4        mvtnorm_1.1-3            future_1.23.0           
 [19] leiden_0.3.9             parallel_4.1.2           irlba_2.3.5              markdown_1.1             Rcpp_1.0.8.3             KernSmooth_2.23-20      
 [25] promises_1.2.0.1         limma_3.50.0             DelayedArray_0.20.0      ggeffects_1.1.1          pkgload_1.2.4            fs_1.5.2                
 [31] textshaping_0.3.6        ranger_0.13.1            digest_0.6.29            png_0.1-7                sctransform_0.3.2        cowplot_1.1.1           
 [37] pkgconfig_2.0.3          ggbeeswarm_0.6.0         estimability_1.3         minqa_1.2.4              reticulate_1.22          beeswarm_0.4.0          
 [43] xfun_0.29                bslib_0.3.1              tidyselect_1.1.1         performance_0.8.0        reshape2_1.4.4           ica_1.0-2               
 [49] viridisLite_0.4.0        rtracklayer_1.54.0       pkgbuild_1.3.1           rlang_1.0.2              jquerylib_0.1.4          glue_1.6.2              
 [55] ensembldb_2.18.2         modelr_0.1.8             emmeans_1.7.2            ggsignif_0.6.3           bayestestR_0.11.5        labeling_0.4.2          
 [61] maptools_1.1-2           httpuv_1.6.5             class_7.3-20             Rttf2pt1_1.3.9           TH.data_1.1-0            annotate_1.72.0         
 [67] jsonlite_1.7.2           XVector_0.34.0           bit_4.0.4                mime_0.12                systemfonts_1.0.3        gridExtra_2.3           
 [73] Rsamtools_2.10.0         stringi_1.7.6            insight_0.16.0           processx_3.5.2           spatstat.sparse_2.1-0    scattermore_0.7         
 [79] survey_4.1-1             quadprog_1.5-8           bitops_1.0-7             cli_3.2.0                sqldf_0.4-11             maps_3.4.0              
 [85] RSQLite_2.2.9            prereg_0.5.0             rticles_0.22             rsconnect_0.8.25         rstudioapi_0.13          GenomicAlignments_1.30.0
 [91] nlme_3.1-155             locfit_1.5-9.4           listenv_0.8.0            miniUI_0.1.1.1           survMisc_0.5.5           dbplyr_2.1.1            
 [97] sessioninfo_1.2.2        readxl_1.3.1             lifecycle_1.0.1          munsell_0.5.0            cellranger_1.1.0         ggsci_2.9               
[103] codetools_0.2-18         coda_0.19-4              vipor_0.4.5              lmtest_0.9-39            sys_3.4                  htmlTable_2.4.0         
[109] proto_1.0.0              xtable_1.8-4             ROCR_1.0-11              abind_1.4-5              farver_2.1.0             parallelly_1.30.0       
[115] km.ci_0.5-2              credentials_1.3.2        RANN_2.6.1               askpass_1.1              visdat_0.5.3             BiocIO_1.4.0            
[121] sjstats_0.18.1           goftest_1.2-3            RcppAnnoy_0.0.19         cluster_2.1.2            future.apply_1.8.1       extrafontdb_1.0         
[127] Matrix_1.4-0             ellipsis_0.3.2           prettyunits_1.1.1        lubridate_1.8.0          ggridges_0.5.3           reprex_2.0.1            
[133] igraph_1.2.11            sjlabelled_1.1.8         remotes_2.4.2            parameters_0.17.0        spatstat.utils_2.3-0     testthat_3.1.1          
[139] getopt_1.20.3            htmltools_0.5.2          BiocFileCache_2.2.0      yaml_2.2.1               utf8_1.2.2               plotly_4.10.0           
[145] XML_3.99-0.8             e1071_1.7-9              foreign_0.8-82           withr_2.5.0              fitdistrplus_1.1-6       BiocParallel_1.28.3     
[151] bit64_4.0.5              effectsize_0.6.0.1       multcomp_1.4-18          ProtGenerics_1.26.0      spatstat.core_2.3-2      Biostrings_2.62.0       
[157] ragg_1.2.1               memoise_2.0.1            evaluate_0.14            geneplotter_1.72.0       tzdb_0.2.0               extrafont_0.17          
[163] callr_3.7.0              ps_1.6.0                 curl_4.3.2               fansi_1.0.2              tensor_1.5               cachem_1.0.6            
[169] desc_1.4.0               deldir_1.0-6             proj4_1.0-10.1           rjson_0.2.21             rstatix_0.7.0            rprojroot_2.0.2         
[175] sass_0.4.0               sandwich_3.0-1           RCurl_1.98-1.5           proxy_0.4-26             car_3.0-12               xml2_1.3.3              
[181] httr_1.4.2               assertthat_0.2.1         boot_1.3-28              globals_0.14.0           R6_2.5.1                 nnet_7.3-17             
[187] progress_1.2.2           genefilter_1.76.0        KEGGREST_1.34.0          ggrastr_1.0.1            splines_4.1.2            carData_3.0-5           
[193] colorspace_2.0-3         generics_0.1.1           base64enc_0.1-3          chron_2.3-56             gridtext_0.1.4           gert_1.5.0              
[199] pillar_1.7.0             ggalt_0.4.0              sp_1.4-6                 GenomeInfoDbData_1.2.7   plyr_1.8.6               gtable_0.3.0            
[205] rvest_1.0.2              zip_2.2.0                restfulr_0.0.13          latticeExtra_0.6-29      biomaRt_2.50.2           fastmap_1.1.0           
[211] Cairo_1.5-14             crosstalk_1.2.0          datawizard_0.3.0         vcd_1.4-9                broom_0.7.11             openssl_1.4.6           
[217] scales_1.1.1             arm_1.12-2               filelock_1.0.2           backports_1.4.1          lme4_1.1-27.1            hms_1.1.1               
[223] Rtsne_0.15               shiny_1.7.1              KMsurv_0.1-5             ash_1.0-15               polyclip_1.10-0          lazyeval_0.2.2          
[229] crayon_1.5.0             reshape_0.8.8            rpart_4.1.16             spatstat.geom_2.3-1      compiler_4.1.2           ggtext_0.1.1            

Saving environment

rm(backup.scRNAseqData)
rm(scRNAseqData, scRNAseqDataCEA39)

save.image(paste0(PROJECT_loc, "/",Today,".",PROJECTNAME,".AESCRNA.results.RData"))
© 1979-2022 Sander W. van der Laan | s.w.vanderlaan[at]gmail.com swvanderlaan.github.io.
LS0tCnRpdGxlOiAiTWFwcGluZyB0YXJnZXRzIHRvIHNpbmdsZSBjZWxscyBpbiBwbGFxdWVzLiIKYXV0aG9yOiAiW1NhbmRlciBXLiB2YW4gZGVyIExhYW4sIFBoRF0oaHR0cHM6Ly9zd3ZhbmRlcmxhYW4uZ2l0aHViLmlvKSB8IEBzd3ZhbmRlcmxhYW4gfCBzLncudmFuZGVybGFhbkBnbWFpbC5jb20iCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjYWNoZTogeWVzCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGNvbGxhcHNlOiB5ZXMKICAgIGRmX3ByaW50OiBwYWdlZAogICAgZmlnLmFsaWduOiBjZW50ZXIKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIGZpZ19oZWlnaHQ6IDYKICAgIGZpZ19yZXRpbmE6IDIKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgdGhlbWU6IGx1bWVuCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IG5vCiAgICAgIHNtb290aF9zY3JvbGw6IHllcwptYWluZm9udDogQXJpYWwKc3VidGl0bGU6IEFjY29tcGFueWluZyAnUGxhcXVlIGV4cHJlc3Npb24gbGV2ZWxzIG9mIEhEQUM5IGluIGFzc29jaWF0aW9uIHdpdGggcGxhcXVlIHZ1bG5lcmFiaWxpdHkgdHJhaXRzIGFuZCBzZWNvbmRhcnkgdmFzY3VsYXIgZXZlbnRzIGluIHBhdGllbnRzIHVuZGVyZ29pbmcgY2Fyb3RpZCBlbmRhcnRlcmVjdG9teSwgYW4gYW5hbHlzaXMgaW4gdGhlIEF0aGVyby1FWFBSRVNTIEJpb2JhbmsuJwplZGl0b3Jfb3B0aW9uczoKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCiMgYmlibGlvZ3JhcGh5OiByZWZlcmVuY2VzLmJpYgojIGtuaXQ6IHdvcmNzOjpjaXRlX2FsbAotLS0KCiMgR2VuZXJhbCBTZXR1cAoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CiMgV2UgcmVjb21tZW5kIHRoYXQgeW91IHByZXBhcmUgeW91ciByYXcgZGF0YSBmb3IgYW5hbHlzaXMgaW4gJ3ByZXBhcmVfZGF0YS5SJywKIyBhbmQgZW5kIHRoYXQgZmlsZSB3aXRoIGVpdGhlciBvcGVuX2RhdGEoeW91cmRhdGEpLCBvciBjbG9zZWRfZGF0YSh5b3VyZGF0YSkuCiMgVGhlbiwgdW5jb21tZW50IHRoZSBsaW5lIGJlbG93IHRvIGxvYWQgdGhlIG9yaWdpbmFsIG9yIHN5bnRoZXRpYyBkYXRhCiMgKHdoaWNoZXZlciBpcyBhdmFpbGFibGUpLCB0byBhbGxvdyBhbnlvbmUgdG8gcmVwcm9kdWNlIHlvdXIgY29kZToKIyBsb2FkX2RhdGEoKQoKIyBmdXJ0aGVyIGRlZmluZSBzb21lIGtuaXRyLW9wdGlvbnMuCmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDgsIGZpZy5wYXRoID0gJ0ZpZ3VyZXMvJywgCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gVFJVRSwgIyBzaG93IHdhcm5pbmdzIGR1cmluZyBjb2RlYm9vayBnZW5lcmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gVFJVRSwgIyBzaG93IG1lc3NhZ2VzIGR1cmluZyBjb2RlYm9vayBnZW5lcmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IFRSVUUsICMgZG8gbm90IGludGVycnVwdCBjb2RlYm9vayBnZW5lcmF0aW9uIGluIGNhc2Ugb2YgZXJyb3JzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB1c3VhbGx5IGJldHRlciBmb3IgZGVidWdnaW5nCiAgICAgICAgICAgICAgICAgICAgICBlY2hvID0gVFJVRSwgICMgc2hvdyBSIGNvZGUKICAgICAgICAgICAgICAgICAgICAgIGV2YWwgPSBUUlVFKQoKZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX21pbmltYWwoKSkKIyBwYW5kZXI6OnBhbmRlck9wdGlvbnMoInRhYmxlLnNwbGl0LnRhYmxlIiwgSW5mKQpsaWJyYXJ5KCJ3b3JjcyIpCmxpYnJhcnkoInJtYXJrZG93biIpCgpgYGAKCmBgYHtyIGVjaG8gPSBGQUxTRX0Kcm0obGlzdCA9IGxzKCkpCmBgYAoKYGBge3IgTG9jYWxTeXN0ZW0sIGVjaG8gPSBGQUxTRX0KIyMjIE9wZXJhdGluZyBTeXN0ZW0gVmVyc2lvbgojIyMgTWFjQm9vayBQcm8KUk9PVF9sb2MgPSAiL1VzZXJzL3N3dmFuZGVybGFhbiIKCiMjIyBNYWNCb29rIEFpciAKIyBST09UX2xvYyA9ICIvVXNlcnMvc2xhYW4zIgoKIyMjIEdlbmVyYWwKR0VOT01JQ19sb2MgPSBwYXN0ZTAoUk9PVF9sb2MsICIvT25lRHJpdmUgLSBVTUMgVXRyZWNodC9HZW5vbWljcyIpCkFFREJfbG9jID0gcGFzdGUwKEdFTk9NSUNfbG9jLCAiL0F0aGVyby1FeHByZXNzL0FFLUFBQV9HU19EQnMiKQpMQUJfbG9jID0gcGFzdGUwKEdFTk9NSUNfbG9jLCAiL0xhYkJ1c2luZXNzIikKClBST0pFQ1RfbG9jID0gcGFzdGUwKFJPT1RfbG9jLCAiL2dpdC9DaXJjdWxhdG9yeUhlYWx0aC9BRV8yMDIxMTIwMV9ZQVdfU1dWQU5ERVJMQUFOX0hEQUM5IikKCiMgR2VuZXRpYyBhbmQgZ2Vub21pYyBkYXRhClNUT1JBR0VfbG9jID0gcGFzdGUwKFJPT1RfbG9jLCAiL1BMSU5LIikKQUVSTkFfbG9jID0gcGFzdGUwKFNUT1JBR0VfbG9jLCAiL19BRV9PUklHSU5BTFMvQUVSTkEiKQpBRVNDUk5BX2xvYyA9IHBhc3RlMChTVE9SQUdFX2xvYywgIi9fQUVfT1JJR0lOQUxTL0FFU0NSTkEvcHJlcHBlZF9kYXRhIikKQUVHU1FDX2xvYyA9IHBhc3RlMChTVE9SQUdFX2xvYywgIi9fQUVfT1JJR0lOQUxTL0FFR1NfQ09NQklORURfUUMyMDE4IikKCiMjIyBTT01FIFZBUklBQkxFUyBXRSBORUVEIERPV04gVEhFIExJTkUKVFJBSVRfT0ZfSU5URVJFU1QgPSAiSERBQzkiICMgUGhlbm90eXBlClBST0pFQ1ROQU1FID0gIkhEQUM5IgoKY2F0KCJcbkNyZWF0ZSBhIG5ldyBhbmFseXNpcyBkaXJlY3RvcnkuLi5cbiIpCmlmZWxzZSghZGlyLmV4aXN0cyhmaWxlLnBhdGgoUFJPSkVDVF9sb2MsICIvIixQUk9KRUNUTkFNRSkpLCAKICAgICAgIGRpci5jcmVhdGUoZmlsZS5wYXRoKFBST0pFQ1RfbG9jLCAiLyIsUFJPSkVDVE5BTUUpKSwgCiAgICAgICBGQUxTRSkKQU5BTFlTSVNfbG9jID0gcGFzdGUwKFBST0pFQ1RfbG9jLCIvIixQUk9KRUNUTkFNRSkKCmlmZWxzZSghZGlyLmV4aXN0cyhmaWxlLnBhdGgoQU5BTFlTSVNfbG9jLCAiL1BMT1RTIikpLCAKICAgICAgIGRpci5jcmVhdGUoZmlsZS5wYXRoKEFOQUxZU0lTX2xvYywgIi9QTE9UUyIpKSwgCiAgICAgICBGQUxTRSkKUExPVF9sb2MgPSBwYXN0ZTAoQU5BTFlTSVNfbG9jLCIvUExPVFMiKQoKaWZlbHNlKCFkaXIuZXhpc3RzKGZpbGUucGF0aChQTE9UX2xvYywgIi9RQyIpKSwgCiAgICAgICBkaXIuY3JlYXRlKGZpbGUucGF0aChQTE9UX2xvYywgIi9RQyIpKSwgCiAgICAgICBGQUxTRSkKUUNfbG9jID0gcGFzdGUwKFBMT1RfbG9jLCIvUUMiKQoKaWZlbHNlKCFkaXIuZXhpc3RzKGZpbGUucGF0aChBTkFMWVNJU19sb2MsICIvT1VUUFVUIikpLCAKICAgICAgIGRpci5jcmVhdGUoZmlsZS5wYXRoKEFOQUxZU0lTX2xvYywgIi9PVVRQVVQiKSksIAogICAgICAgRkFMU0UpCk9VVF9sb2MgPSBwYXN0ZTAoQU5BTFlTSVNfbG9jLCAiL09VVFBVVCIpCgppZmVsc2UoIWRpci5leGlzdHMoZmlsZS5wYXRoKEFOQUxZU0lTX2xvYywgIi9CQVNFTElORSIpKSwgCiAgICAgICBkaXIuY3JlYXRlKGZpbGUucGF0aChBTkFMWVNJU19sb2MsICIvQkFTRUxJTkUiKSksIAogICAgICAgRkFMU0UpCkJBU0VMSU5FX2xvYyA9IHBhc3RlMChBTkFMWVNJU19sb2MsICIvQkFTRUxJTkUiKQoKCnNldHdkKHBhc3RlMChQUk9KRUNUX2xvYykpCmdldHdkKCkKbGlzdC5maWxlcygpCgpgYGAKCmBgYHtyIFNvdXJjZSBmdW5jdGlvbnN9CnNvdXJjZShwYXN0ZTAoUFJPSkVDVF9sb2MsICIvc2NyaXB0cy9mdW5jdGlvbnMuUiIpKQpgYGAKCmBgYHtyfQpnZ3Bsb3QyOjp0aGVtZV9zZXQoZ2dwbG90Mjo6dGhlbWVfbWluaW1hbCgpKQpwYW5kZXI6OnBhbmRlck9wdGlvbnMoInRhYmxlLnNwbGl0LnRhYmxlIiwgSW5mKQpgYGAKCmBgYHtyIGxvYWRpbmdfcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Cmluc3RhbGwucGFja2FnZXMuYXV0bygicGFuZGVyIikKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJyZWFkciIpCmluc3RhbGwucGFja2FnZXMuYXV0bygib3B0cGFyc2UiKQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oInRvb2xzIikKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJkcGx5ciIpCmluc3RhbGwucGFja2FnZXMuYXV0bygidGlkeXIiKQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oIm5hbmlhciIpCgojIFRvIGdldCAnZGF0YS50YWJsZScgd2l0aCAnZndyaXRlJyB0byBiZSBhYmxlIHRvIGRpcmVjdGx5IHdyaXRlIGd6aXBwZWQtZmlsZXMKIyBSZWY6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQyNzg4NDAxL2lzLXBvc3NpYmxlLXRvLXVzZS1md3JpdGUtZnJvbS1kYXRhLXRhYmxlLXdpdGgtZ3pmaWxlCiMgaW5zdGFsbC5wYWNrYWdlcygiZGF0YS50YWJsZSIsIHJlcG9zID0gImh0dHBzOi8vUmRhdGF0YWJsZS5naXRsYWIuaW8vZGF0YS50YWJsZSIpCmxpYnJhcnkoZGF0YS50YWJsZSkKCmluc3RhbGwucGFja2FnZXMuYXV0bygidGlkeXZlcnNlIikKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJrbml0ciIpCmluc3RhbGwucGFja2FnZXMuYXV0bygiRFQiKQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oImVlcHRvb2xzIikKCmluc3RhbGwucGFja2FnZXMuYXV0bygib3Blbnhsc3giKQoKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJoYXZlbiIpCmluc3RhbGwucGFja2FnZXMuYXV0bygidGFibGVvbmUiKQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oInNqUGxvdCIpCgppbnN0YWxsLnBhY2thZ2VzLmF1dG8oIkJsYW5kQWx0bWFuTGVoIikKCiMgSW5zdGFsbCB0aGUgZGV2dG9vbHMgcGFja2FnZSBmcm9tIEhhZGxleSBXaWNraGFtCmluc3RhbGwucGFja2FnZXMuYXV0bygnZGV2dG9vbHMnKQoKIyBmb3IgcGxvdHRpbmcKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJwaGVhdG1hcCIpCmluc3RhbGwucGFja2FnZXMuYXV0bygiZm9yZXN0cGxvdCIpCmluc3RhbGwucGFja2FnZXMuYXV0bygiZ2dwbG90MiIpCgppbnN0YWxsLnBhY2thZ2VzLmF1dG8oImdncHViciIpCgppbnN0YWxsLnBhY2thZ2VzLmF1dG8oIlVwU2V0UiIpCgpkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoInRob21hc3A4NS9wYXRjaHdvcmsiKQoKIyBmb3IgU2V1cmF0IGV0YwppbnN0YWxsLnBhY2thZ2VzLmF1dG8oIm9yZy5Icy5lZy5kYiIpCmluc3RhbGwucGFja2FnZXMuYXV0bygibXlnZW5lIikKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJFbmhhbmNlZFZvbGNhbm8iKQpgYGAKCmBgYHtyfQoKIyBJbnN0YWxsIHRoZSBkZXZ0b29scyBwYWNrYWdlIGZyb20gSGFkbGV5IFdpY2toYW0KaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCdkZXZ0b29scycpCiMgUmVwbGFjZSAnMi4zLjQnIHdpdGggeW91ciBkZXNpcmVkIHZlcnNpb24KIyBkZXZ0b29sczo6aW5zdGFsbF92ZXJzaW9uKHBhY2thZ2UgPSAnU2V1cmF0JywgdmVyc2lvbiA9IHBhY2thZ2VfdmVyc2lvbignMi4zLjQnKSkKIyBpbnN0YWxsLnBhY2thZ2VzKCJTZXVyYXQiKQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oIlNldXJhdCIpICMgbGF0ZXN0IHZlcnNpb24KbGlicmFyeSgiU2V1cmF0IikKCmBgYAoKYGBge3IgU2V0dGluZzogQ29sb3JzfQoKVG9kYXkgPSBmb3JtYXQoYXMuRGF0ZShhcy5QT1NJWGx0KFN5cy50aW1lKCkpKSwgIiVZJW0lZCIpClRvZGF5LlJlcG9ydCA9IGZvcm1hdChhcy5EYXRlKGFzLlBPU0lYbHQoU3lzLnRpbWUoKSkpLCAiJUEsICVCICVkLCAlWSIpCgojIyMgVXRyZWNodFNjaWVuY2VQYXJrQ29sb3Vyc1NjaGVtZQojIyMKIyMjIFdlYnNpdGV0b2NvbnZlcnRIRVh0b1JHQjpodHRwOi8vaGV4LmNvbG9ycnJzLmNvbS4KIyMjIEZvcnNvbWVmdW5jdGlvbnN5b3VzaG91bGRkaXZpZGV0aGVzZW51bWJlcnNieTI1NS4KIyMjCiMjIwlOby4JQ29sb3IJCQkgICAgICBIRVgJKFJHQikJCQkJCQkgICAgICAgICAgICAgIENIUgkJICBNQUYvSU5GTwojIyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyMjCTEJICB5ZWxsb3cJCQkgICAgI0ZCQjgyMCAoMjUxLDE4NCwzMikJCQkJICAgICAgPT4JMQkJb3IgMS4wPklORk8KIyMjCTIJICBnb2xkCQkJICAgICAgI0Y1OUQxMCAoMjQ1LDE1NywxNikJCQkJICAgICAgPT4JMgkJCiMjIwkzCSAgc2FsbW9uCQkJICAgICNFNTU3MzggKDIyOSw4Nyw1NikJCQkJICAgICAgPT4JMwkJb3IgMC4wNTxNQUY8MC4yIG9yIDAuNDxJTkZPPDAuNgojIyMJNAkgIGRhcmtwaW5rCQkgICAgI0RCMDAzRiAoKDIxOSwwLDYzKQkJCQkgICAgICA9Pgk0CQkKIyMjCTUJICBsaWdodHBpbmsJCSAgICAjRTM1NDkzICgyMjcsODQsMTQ3KQkJCQkgICAgICA9Pgk1CQlvciAwLjg8SU5GTzwxLjAKIyMjCTYJICBwaW5rCQkJICAgICAgI0Q1MjY3QiAoMjEzLDM4LDEyMykJCQkJICAgICAgPT4JNgkJCiMjIwk3CSAgaGFyZHBpbmsJCSAgICAjQ0MwMDcxICgyMDQsMCwxMTMpCQkJCSAgICAgID0+CTcJCQojIyMJOAkgIGxpZ2h0cHVycGxlCSAgICAjQTg0NDhBICgxNjgsNjgsMTM4KQkJCQkgICAgICA9Pgk4CQkKIyMjCTkJICBwdXJwbGUJCQkgICAgIzlBMzQ4MCAoMTU0LDUyLDEyOCkJCQkJICAgICAgPT4JOQkJCiMjIwkxMAlsYXZlbmRlbAkJICAgICM4RDVCOUEgKDE0MSw5MSwxNTQpCQkJCSAgICAgID0+CTEwCQkKIyMjCTExCWJsdWVwdXJwbGUJCSAgIzcwNTI5NiAoMTEyLDgyLDE1MCkJCQkJICAgICAgPT4JMTEJCQojIyMJMTIJcHVycGxlYmx1ZQkJICAjNjg2QUE5ICgxMDQsMTA2LDE2OSkJCQkgICAgICA9PgkxMgkJCiMjIwkxMwlsaWdodHB1cnBsZWJsdWUJIzYxNzNBRCAoOTcsMTE1LDE3My8xMDEsMTIwLDE4MCkJPT4JMTMJCQojIyMJMTQJc2VhYmx1ZQkJCSAgICAjNEM4MUJGICg3NiwxMjksMTkxKQkJCQkgICAgICA9PgkxNAkJCiMjIwkxNQlza3libHVlCQkJICAgICMyRjhCQzkgKDQ3LDEzOSwyMDEpCQkJCSAgICAgID0+CTE1CQkKIyMjCTE2CWF6dXJibHVlCQkgICAgIzEyOTBEOSAoMTgsMTQ0LDIxNykJCQkJICAgICAgPT4JMTYJCW9yIDAuMDE8TUFGPDAuMDUgb3IgMC4yPElORk88MC40CiMjIwkxNwlsaWdodGF6dXJibHVlCSAgIzEzOTZEOCAoMTksMTUwLDIxNikJCQkJICAgICAgPT4JMTcJCQojIyMJMTgJZ3JlZW5ibHVlCQkgICAgIzE1QTZDMSAoMjEsMTY2LDE5MykJCQkJICAgICAgPT4JMTgJCQojIyMJMTkJc2Vhd2VlZGdyZWVuCSAgIzVFQjE3RiAoOTQsMTc3LDEyNykJCQkJICAgICAgPT4JMTkJCQojIyMJMjAJeWVsbG93Z3JlZW4JCSAgIzg2QjgzMyAoMTM0LDE4NCw1MSkJCQkJICAgICAgPT4JMjAJCQojIyMJMjEJbGlnaHRtb3NzZ3JlZW4JI0M1RDIyMCAoMTk3LDIxMCwzMikJCQkJICAgICAgPT4JMjEJCQojIyMJMjIJbW9zc2dyZWVuCQkgICAgIzlGQzIyOCAoMTU5LDE5NCw0MCkJCQkJICAgICAgPT4JMjIJCW9yIE1BRj4wLjIwIG9yIDAuNjxJTkZPPDAuOAojIyMJMjMJbGlnaHRncmVlbgkgIAkjNzhCMTEzICgxMjAsMTc3LDE5KQkJCQkgICAgICA9PgkyMy9YCiMjIwkyNAlncmVlbgkJCSAgICAgICM0OUEwMUQgKDczLDE2MCwyOSkJCQkJICAgICAgPT4JMjQvWQojIyMJMjUJZ3JleQkJCSAgICAgICM1OTVBNUMgKDg5LDkwLDkyKQkJCQkgICAgICAgID0+CTI1L1hZCW9yIE1BRjwwLjAxIG9yIDAuMDxJTkZPPDAuMgojIyMJMjYJbGlnaHRncmV5CQkgICAgI0EyQTNBNAkoMTYyLDE2MywxNjQpCQkJICAgICAgPT4JMjYvTVQKIyMjCiMjIwlBRERJVElPTkFMIENPTE9SUwojIyMJMjcJbWlkZ3JleQkJCSNEN0Q4RDcKIyMjCTI4CXZlcnlsaWdodGdyZXkJI0VDRUNFQyIKIyMjCTI5CXdoaXRlCQkJI0ZGRkZGRgojIyMJMzAJYmxhY2sJCQkjMDAwMDAwCiMjIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnVpdGhvZl9jb2xvciA9IGMoIiNGQkI4MjAiLCIjRjU5RDEwIiwiI0U1NTczOCIsIiNEQjAwM0YiLCIjRTM1NDkzIiwiI0Q1MjY3QiIsCiAgICAgICAgICAgICAgICAgIiNDQzAwNzEiLCIjQTg0NDhBIiwiIzlBMzQ4MCIsIiM4RDVCOUEiLCIjNzA1Mjk2IiwiIzY4NkFBOSIsCiAgICAgICAgICAgICAgICAgIiM2MTczQUQiLCIjNEM4MUJGIiwiIzJGOEJDOSIsIiMxMjkwRDkiLCIjMTM5NkQ4IiwiIzE1QTZDMSIsCiAgICAgICAgICAgICAgICAgIiM1RUIxN0YiLCIjODZCODMzIiwiI0M1RDIyMCIsIiM5RkMyMjgiLCIjNzhCMTEzIiwiIzQ5QTAxRCIsCiAgICAgICAgICAgICAgICAgIiM1OTVBNUMiLCIjQTJBM0E0IiwgIiNEN0Q4RDciLCAiI0VDRUNFQyIsICIjRkZGRkZGIiwgIiMwMDAwMDAiKQoKdWl0aG9mX2NvbG9yX2xlZ2VuZCA9IGMoIiNGQkI4MjAiLCAiI0Y1OUQxMCIsICIjRTU1NzM4IiwgIiNEQjAwM0YiLCAiI0UzNTQ5MyIsCiAgICAgICAgICAgICAgICAgICAgICAgICIjRDUyNjdCIiwgIiNDQzAwNzEiLCAiI0E4NDQ4QSIsICIjOUEzNDgwIiwgIiM4RDVCOUEiLAogICAgICAgICAgICAgICAgICAgICAgICAiIzcwNTI5NiIsICIjNjg2QUE5IiwgIiM2MTczQUQiLCAiIzRDODFCRiIsICIjMkY4QkM5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIiMxMjkwRDkiLCAiIzEzOTZEOCIsICIjMTVBNkMxIiwgIiM1RUIxN0YiLCAiIzg2QjgzMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICIjQzVEMjIwIiwgIiM5RkMyMjgiLCAiIzc4QjExMyIsICIjNDlBMDFEIiwgIiM1OTVBNUMiLAogICAgICAgICAgICAgICAgICAgICAgICAiI0EyQTNBNCIsICIjRDdEOEQ3IiwgIiNFQ0VDRUMiLCAiI0ZGRkZGRiIsICIjMDAwMDAwIikKIyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYGBgCgojIEVSQS1DVkQgJ2RydWdnYWJsZS1NSS10YXJnZXRzJwoKPCEtLSAhW0VSQS1DVkQgbG9nb10oIlVzZXJzL3N3dmFuZGVybGFhbi9pQ2xvdWQvR2Vub21pY3MvUHJvamVjdHMvI0RydWdnYWJsZS1NSS1HZW5lcy9BZG1pbmlzdHJhdGlvbi9FUkEtQ1ZEXCBMb2dvX0NNWUsuanBnIikgLS0+CgpGb3IgdGhlIEVSQS1DVkQgJ2RydWdnYWJsZS1NSS10YXJnZXRzJyBwcm9qZWN0IChncmFudG51bWJlcjogMDFLTDE4MDIpIHdlIHBlcmZvcm1lZCB0d28gcmVsYXRlZCBSTkEgc2VxdWVuY2luZyAoUk5Bc2VxKSBleHBlcmltZW50czoKCjEpICBjb252ZW50aW9uYWwgKCdidWxrJykgUk5Bc2VxIHVzaW5nIFJOQSBleHRyYWN0ZWQgZnJvbSBjYXJvdGlkIHBsYXF1ZSBzYW1wbGVzLCBuIMKxIDcwMC4gQXMgb2YgYHIgVG9kYXkuUmVwb3J0YCBhbGwgc2FtcGxlcyBoYXZlIGJlZW4gc2VsZWN0ZWQgYW5kClJOQSBoYXMgYmVlbiBleHRyYWN0ZWQ7IHF1YWxpdHkgY29udHJvbCAoUUMpIHdhcyBwZXJmb3JtZWQgYW5kIHdlIGhhdmUgYSBkYXRhc2V0IG9mIDYzNSBzYW1wbGVzLgoKMikgIHNpbmdsZS1jZWxsIFJOQXNlcSAoc2NSTkFzZXEpIG9mIGF0IGxlYXN0IG4gPSA0MCBzYW1wbGVzICgyMCBmZW1hbGVzLCAyMCBtYWxlcykuIEFzIG9mIGByIFRvZGF5LlJlcG9ydGAgZGF0YSBpcyBhdmFpbGFibGUgb2YgNDAgc2FtcGxlcyAoMyBmZW1hbGVzLCAxNSBtYWxlcyksIHdlIGFyZSBleHRlbmRpbmcgc2FtcGxpbmcgdG8gZ2V0IG1vcmUgZmVtYWxlIHNhbXBsZXMuCgpQbGFxdWUgc2FtcGxlcyBhcmUgZGVyaXZlZCBmcm9tIGNhcm90aWQgZW5kYXJ0ZXJlY3RvbWllcyBhcyBwYXJ0IG9mIHRoZSBbQXRoZXJvLUV4cHJlc3MgQmlvYmFuayBTdHVkeV0oaHR0cDp3d3cvYXRoZXJvZXhwcmVzcy5ubCkgd2hpY2ggaXMgYW4gb25nb2luZyBzdHVkeSBpbiB0aGUgVU1DIFV0cmVjaHQuCgojIEJhY2tncm91bmQKCkhlcmUgd2UgbWFwIHRoZSBgciBUUkFJVF9PRl9JTlRFUkVTVGAgdG8gc2luZ2xlLWNlbGxzIGZyb20gdGhlIHBsYXF1ZXMuCgpgYGB7ciB0YXJnZXRzIGZvciBtYXBwaW5nfQoKbGlicmFyeShvcGVueGxzeCkKCmdlbmVfbGlzdF9kZiA8LSByZWFkLnhsc3gocGFzdGUwKFBST0pFQ1RfbG9jLCAiL3RhcmdldHMvR2VuZXMueGxzeCIpLCBzaGVldCA9ICJHZW5lcyIpCgp0YXJnZXRfZ2VuZXMgPC0gdW5saXN0KGdlbmVfbGlzdF9kZiRHZW5lKQp0YXJnZXRfZ2VuZXMKCmBgYAoKIyBMb2FkIGRhdGEKCkZpcnN0IHdlIHdpbGwgbG9hZCB0aGUgZGF0YToKCi0gICBzY1JOQXNlcSBleHBlcmltZW50YWwgZGF0YSBhbmQgcmVuYW1lIHRoZSBjZWxsIHR5cGVzLgotICAgQXRoZXJvLUV4cHJlc3MgY2xpbmljYWwgZGF0YS4KCkhlcmUgd2UgbG9hZCB0aGUgbGF0ZXN0IGRhdGFzZXQgZnJvbSBvdXIgQXRoZXJvLUV4cHJlc3Mgc2luZ2xlLWNlbGwgUk5BIGV4cGVyaW1lbnQuCgpgYGB7ciBMb2FkRGF0YX0KCiMgbG9hZChwYXN0ZTAoQUVTQ1JOQV9sb2MsICIvMjAyMTA4MTEuNDYucGF0aWVudHMuS1AuUkRhdGEiKSkKIyBzY1JOQXNlcURhdGEgPC0gc2V1c2V0CiMgcm0oc2V1c2V0KQojIAojIHNhdmVSRFMoc2NSTkFzZXFEYXRhLCBwYXN0ZTAoQUVTQ1JOQV9sb2MsICIvMjAyMTA4MTEuNDYucGF0aWVudHMuS1AuUkRTIikpCgpzY1JOQXNlcURhdGEgPC0gcmVhZFJEUyhwYXN0ZTAoQUVTQ1JOQV9sb2MsICIvMjAyMTA4MTEuNDYucGF0aWVudHMuS1AuUkRTIikpCgpzY1JOQXNlcURhdGEKCmBgYAoKVGhlIG5hbWluZy9jbGFzc2lmaWNhdGlvbiBpcyBiYXNlZCBvbiBhIGNvbWJpbmF0aW9uIGNvbnZlbnRpb25hbCBtYXJrZXJzLiBXZSBkbyBub3QgY2xhaW0gdG8ga25vdyB0aGUgZXhhY3QgaWRlbnRpdHkgb2YgZWFjaCBjZWxsLCByYXRoZXIgd2UgcmVmZXIgdG8gY2VsbHMgYXMgJ0tJVCsgTWFzdCBjZWxscyItbGlrZSBjZWxscy4gTGlrZXdpc2Ugd2UgcmVmZXIgdG8gdGhlIGNlbGwgY2x1c3RlcnMgYXMgJ2NvbW11bml0aWVzJyBvZiBjZWxscyB0aGF0IGV4aGliaXQgc2ltaWxhciBwcm9wZXJ0aWVzLCAqaS5lLiogc2ltaWxhciBkZWZpbmluZyBtYXJrZXJzICgqZS5nLiBLSVQqKS4KCldlIHdpbGwgcmVuYW1lIHRoZSBjZWxsIHR5cGVzIHRvIGh1bWFuIHJlYWRhYmxlIG5hbWVzLgoKYGBge3IgQ2hhbmdlIGNlbGwgY3VtbXVuaXR5IG5hbWVzfQojIyMgY2hhbmdlIG5hbWVzIGZvciBjbGFyaXR5CmJhY2t1cC5zY1JOQXNlcURhdGEgPSBzY1JOQXNlcURhdGEKIyBnZXQgdGhlIG9sZCBuYW1lcyB0byBjaGFuZ2UgdG8gbmV3IG5hbWVzClVNQVBQbG90KHNjUk5Bc2VxRGF0YSwgbGFiZWwgPSBGQUxTRSwgcHQuc2l6ZSA9IDEuMjUsIGxhYmVsLnNpemUgPSA0LCBncm91cC5ieSA9ICJpZGVudCIpCgpgYGAKCmBgYHtyfQp1bmlxdWUoc2NSTkFzZXFEYXRhQGFjdGl2ZS5pZGVudCkKYGBgCgpgYGB7cn0KY2VsbHR5cGVzIDwtIGMoIkNENjgrQ0Q0KyBNb25vY3l0ZXMiID0gIkNENjgrQ0Q0KyBNb25vIiwgCiAgICAgICAgICAgICAgICJDRDY4K0lMMTgrVExSNCtUUkVNMisgUmVzaWRlbnQgbWFjcm9waGFnZXMiID0gIkNENjgrSUwxOCtUTFI0K1RSRU0yKyBNUmVzIiwgCiAgICAgICAgICAgICAgICJDRDY4K0NEMUMrIERlbmRyaXRpYyBDZWxscyIgPSAiQ0Q2OCtDRDFDKyBEQyIsCiAgICAgICAgICAgICAgICJDRDY4K0NBU1AxK0lMMUIrU0VMTCsgSW5mbGFtbWF0b3J5IG1hY3JvcGhhZ2VzIiA9ICJDRDY4K0NBU1AxK0lMMUIrU0VMTCBNSW5mIiwKICAgICAgICAgICAgICAgIkNENjgrQUJDQTErT0xSMStUUkVNMisgRm9hbSBDZWxscyIgPSAiQ0Q2OCtBQkNBMStPTFIxK1RSRU0yKyBGQyIsCiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAjIFQtY2VsbHMKICAgICAgICAgICAgICAgIkNEMysgVCBDZWxscyBJIiA9ICJDRDMrIFRDIEkiLAogICAgICAgICAgICAgICAiQ0QzKyBUIENlbGxzIElJIiA9ICJDRDMrIFRDIElJIiwgCiAgICAgICAgICAgICAgICJDRDMrIFQgQ2VsbHMgSUlJIiA9ICJDRDMrIFRDIElJSSIsIAogICAgICAgICAgICAgICAiQ0QzKyBUIENlbGxzIElWIiA9ICJDRDMrIFRDIElWIiwgCiAgICAgICAgICAgICAgICJDRDMrIFQgQ2VsbHMgViIgPSAiQ0QzKyBUQyBWIiwgCiAgICAgICAgICAgICAgICJDRDMrIFQgQ2VsbHMgVkkiID0gIkNEMysgVEMgVkkiLCAKICAgICAgICAgICAgICAgIkZPWFAzKyBUIENlbGxzIiA9ICJGT1hQMysgVEMiLAogICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIyBFbmRvdGhlbGlhbCBjZWxscwogICAgICAgICAgICAgICAiQ0QzNCsgRW5kb3RoZWxpYWwgQ2VsbHMgSSIgPSAiQ0QzNCsgRUMgSSIsIAogICAgICAgICAgICAgICAiQ0QzNCsgRW5kb3RoZWxpYWwgQ2VsbHMgSUkiID0gIkNEMzQrIEVDIElJIiwgCiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAjIFNNQwogICAgICAgICAgICAgICAiQUNUQTIrIFNtb290aCBNdXNjbGUgQ2VsbHMiID0gIkFDVEEyKyBTTUMiLCAKICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICMgTksgQ2VsbHMKICAgICAgICAgICAgICAgIkNEMytDRDU2KyBOSyBDZWxscyBJIiA9ICJDRDMrQ0Q1NisgTksgSSIsCiAgICAgICAgICAgICAgICJDRDMrQ0Q1NisgTksgQ2VsbHMgSUkiID0gIkNEMytDRDU2KyBOSyBJSSIsCiAgICAgICAgICAgICAgICMgTWFzdAogICAgICAgICAgICAgICAiQ0Q2OCtLSVQrIE1hc3QgQ2VsbHMiID0gIkNENjgrS0lUKyBNQyIsCiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAiQ0Q3OUErIENsYXNzLXN3aXRjaGVkIE1lbW9yeSBCIENlbGxzIiA9ICJDRDc5QSsgQkNtZW0iLCAKICAgICAgICAgICAgICAgIkNENzkrIFBsYXNtYSBCIENlbGxzIiA9ICJDRDc5KyBCQ3BsYXNtYSIpCgpzY1JOQXNlcURhdGEgPC0gU2V1cmF0OjpSZW5hbWVJZGVudHMob2JqZWN0ID0gc2NSTkFzZXFEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbHR5cGVzKQpgYGAKCmBgYHtyIENoYW5nZSBjZWxsIGN1bW11bml0eSBuYW1lcyAtIG5ldyBwbG90fQpVTUFQUGxvdChzY1JOQXNlcURhdGEsIGxhYmVsID0gVFJVRSwgcHQuc2l6ZSA9IDEuMjUsIGxhYmVsLnNpemUgPSA0LCBncm91cC5ieSA9ICJpZGVudCIsCiAgICAgICAgIHJlcGVsID0gVFJVRSkKCmBgYAoKIyMgQ2xpbmljYWwgZGF0YQoKTG9hZGluZyB0aGUgQXRoZXJvLUV4cHJlc3MgY2xpbmljYWwgZGF0YS4KCmBgYHtyIExvYWRBRURCfQoKQUVEQi5DRUEgPC0gcmVhZFJEUyhmaWxlID0gcGFzdGUwKE9VVF9sb2MsICIvMjAyMjAzMTkuIixUUkFJVF9PRl9JTlRFUkVTVCwiLkFFREIuQ0VBLlJEUyIpKQoKYGBgCgoKYGBge3IgfQoKIyBCYXNlbGluZSB0YWJsZSB2YXJpYWJsZXMKYmFzZXRhYmxlX3ZhcnMgPSBjKCJIb3NwaXRhbCIsICJPUnllYXIiLCAiQXJ0ZXJ5X3N1bW1hcnkiLAogICAgICAgICAgICAgICAgICAgIkFnZSIsICJHZW5kZXIiLCAKICAgICAgICAgICAgICAgICAgICMgIlRDX2ZpbmFsQ1UiLCAiTERMX2ZpbmFsQ1UiLCAiSERMX2ZpbmFsQ1UiLCAiVEdfZmluYWxDVSIsIAogICAgICAgICAgICAgICAgICAgIlRDX2ZpbmFsIiwgIkxETF9maW5hbCIsICJIRExfZmluYWwiLCAiVEdfZmluYWwiLCAKICAgICAgICAgICAgICAgICAgICMgImhzQ1JQX3BsYXNtYSIsCiAgICAgICAgICAgICAgICAgICAic3lzdG9saWMiLCAiZGlhc3RvbGkiLCAiR0ZSX01EUkQiLCAiQk1JIiwgCiAgICAgICAgICAgICAgICAgICAiS0RPUUkiLCAiQk1JX1dITyIsCiAgICAgICAgICAgICAgICAgICAiU21va2VyU3RhdHVzIiwgIkFsY29ob2xVc2UiLAogICAgICAgICAgICAgICAgICAgIkRpYWJldGVzU3RhdHVzIiwgCiAgICAgICAgICAgICAgICAgICAiSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnQiLCAiSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnRkcnVnIiwgIkh5cGVydGVuc2lvbi5jb21wb3NpdGUiLCAiSHlwZXJ0ZW5zaW9uLmRydWdzIiwgCiAgICAgICAgICAgICAgICAgICAiTWVkLmFudGljb2FndWxhbnRzIiwgIk1lZC5hbGwuYW50aXBsYXRlbGV0IiwgIk1lZC5TdGF0aW4uTExEIiwgCiAgICAgICAgICAgICAgICAgICAiU3Ryb2tlX0R4IiwgInN5bXB0IiwgIlN5bXB0b21zLjVHIiwgIkFzeW1wdFN5bXB0IiwgIkFzeW1wdFN5bXB0MkciLAogICAgICAgICAgICAgICAgICAgIlN5bXB0b21zLlVwZGF0ZTJHIiwgIlN5bXB0b21zLlVwZGF0ZTNHIiwgImluZGV4c3ltcHRvbXNfbGF0ZXN0XzRnIiwKICAgICAgICAgICAgICAgICAgICJyZXN0ZW5vcyIsICJzdGVub3NlIiwKICAgICAgICAgICAgICAgICAgICJDQURfaGlzdG9yeSIsICJQQU9EIiwgIlBlcmlwaGVyYWwuaW50ZXJ2IiwgCiAgICAgICAgICAgICAgICAgICAiRVBfY29tcG9zaXRlIiwgIkVQX2NvbXBvc2l0ZV90aW1lIiwgIkVQX21ham9yIiwgIkVQX21ham9yX3RpbWUiLAogICAgICAgICAgICAgICAgICAgIk1BQ19yYW5rTm9ybSIsICJTTUNfcmFua05vcm0iLCAiTWFjcm9waGFnZXMuYmluIiwgIlNNQy5iaW4iLAogICAgICAgICAgICAgICAgICAgIk5ldXRyb3BoaWxzX3JhbmtOb3JtIiwgIk1hc3RDZWxsc19yYW5rTm9ybSIsCiAgICAgICAgICAgICAgICAgICAiSVBILmJpbiIsICJWZXNzZWxEZW5zaXR5X3JhbmtOb3JtIiwKICAgICAgICAgICAgICAgICAgICJDYWxjLmJpbiIsICJDb2xsYWdlbi5iaW4iLCAKICAgICAgICAgICAgICAgICAgICJGYXQuYmluXzEwIiwgIkZhdC5iaW5fNDAiLCAiT3ZlcmFsbFBsYXF1ZVBoZW5vdHlwZSIsICJQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCIpCgpiYXNldGFibGVfYmluID0gYygiR2VuZGVyIiwgICJBcnRlcnlfc3VtbWFyeSIsCiAgICAgICAgICAgICAgICAgICJLRE9RSSIsICJCTUlfV0hPIiwKICAgICAgICAgICAgICAgICAgIlNtb2tlclN0YXR1cyIsICJBbGNvaG9sVXNlIiwKICAgICAgICAgICAgICAgICAgIkRpYWJldGVzU3RhdHVzIiwgCiAgICAgICAgICAgICAgICAgICJIeXBlcnRlbnNpb24uc2VsZnJlcG9ydCIsICJIeXBlcnRlbnNpb24uc2VsZnJlcG9ydGRydWciLCAiSHlwZXJ0ZW5zaW9uLmNvbXBvc2l0ZSIsICJIeXBlcnRlbnNpb24uZHJ1Z3MiLCAKICAgICAgICAgICAgICAgICAgIk1lZC5hbnRpY29hZ3VsYW50cyIsICJNZWQuYWxsLmFudGlwbGF0ZWxldCIsICJNZWQuU3RhdGluLkxMRCIsIAogICAgICAgICAgICAgICAgICAiU3Ryb2tlX0R4IiwgInN5bXB0IiwgIlN5bXB0b21zLjVHIiwgIkFzeW1wdFN5bXB0IiwgIkFzeW1wdFN5bXB0MkciLAogICAgICAgICAgICAgICAgICAiU3ltcHRvbXMuVXBkYXRlMkciLCAiU3ltcHRvbXMuVXBkYXRlM0ciLCAiaW5kZXhzeW1wdG9tc19sYXRlc3RfNGciLAogICAgICAgICAgICAgICAgICAicmVzdGVub3MiLCAic3Rlbm9zZSIsCiAgICAgICAgICAgICAgICAgICJDQURfaGlzdG9yeSIsICJQQU9EIiwgIlBlcmlwaGVyYWwuaW50ZXJ2IiwgCiAgICAgICAgICAgICAgICAgICJFUF9tYWpvciIsICJFUF9jb21wb3NpdGUiLCAiTWFjcm9waGFnZXMuYmluIiwgIlNNQy5iaW4iLAogICAgICAgICAgICAgICAgICAiSVBILmJpbiIsIAogICAgICAgICAgICAgICAgICAiQ2FsYy5iaW4iLCAiQ29sbGFnZW4uYmluIiwgCiAgICAgICAgICAgICAgICAgICJGYXQuYmluXzEwIiwgIkZhdC5iaW5fNDAiLCAiT3ZlcmFsbFBsYXF1ZVBoZW5vdHlwZSIsICJQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCIpCiMgYmFzZXRhYmxlX2JpbgoKYmFzZXRhYmxlX2NvbiA9IGJhc2V0YWJsZV92YXJzWyFiYXNldGFibGVfdmFycyAlaW4lIGJhc2V0YWJsZV9iaW5dCiMgYmFzZXRhYmxlX2NvbgpgYGAKCiMjIEFFU0NSTkE6IGJhc2VsaW5lIGNoYXJhY3RlcmlzdGljcwoKIyMjIFByZXBhcmF0aW9uCgpgYGB7ciBCYXNlbGluZTogY3JlYXRpb259Cm1ldGFkYXRhIDwtIHNjUk5Bc2VxRGF0YUBtZXRhLmRhdGEgJT4lIGFzX3RpYmJsZSgpICU+JSBzZXBhcmF0ZShvcmlnLmlkZW50LCBjKCJQYXRpZW50IiwgTkEpKQpzY1JOQXNlcURhdGFNZXRhIDwtIG1ldGFkYXRhICU+JSBkaXN0aW5jdChQYXRpZW50LCAua2VlcF9hbGwgPSBUUlVFKQoKc2NSTkFzZXFEYXRhTWV0YUFFIDwtIG1lcmdlKHNjUk5Bc2VxRGF0YU1ldGEsIEFFREIuQ0VBLCBieS54ID0gIlBhdGllbnQiLCBieS55ID0gIlNUVURZX05VTUJFUiIsIHNvcnQgPSBGQUxTRSwgYWxsLnggPSBUUlVFKQpkaW0oc2NSTkFzZXFEYXRhTWV0YUFFKQoKIyBSZXBsYWNlIG1pc3NpbmcgZGF0YSAKIyBSZWY6IGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9uYW5pYXIvdmlnbmV0dGVzL3JlcGxhY2Utd2l0aC1uYS5odG1sCnJlcXVpcmUobmFuaWFyKQoKbmFfc3RyaW5ncyA8LSBjKCJOQSIsICJOIEEiLCAiTiAvIEEiLCAiTi9BIiwgIk4vIEEiLCAKICAgICAgICAgICAgICAgICJOb3QgQXZhaWxhYmxlIiwgIk5vdCBhdmFpbGFibGUiLCAKICAgICAgICAgICAgICAgICJtaXNzaW5nIiwgCiAgICAgICAgICAgICAgICAiLTk5OSIsICItOTkiLCAKICAgICAgICAgICAgICAgICJObyBkYXRhIGF2YWlsYWJsZS9taXNzaW5nIiwgIk5vIGRhdGEgYXZhaWxhYmxlL01pc3NpbmciKQojIFRoZW4geW91IHdyaXRlIH4ueCAlaW4lIG5hX3N0cmluZ3MgLSB3aGljaCByZWFkcyBhcyDigJxkb2VzIHRoaXMgdmFsdWUgb2NjdXIgaW4gdGhlIGxpc3Qgb2YgTkEgc3RyaW5nc+KAnS4KCnNjUk5Bc2VxRGF0YU1ldGFBRSAlPiUKICByZXBsYWNlX3dpdGhfbmFfYWxsKGNvbmRpdGlvbiA9IH4ueCAlaW4lIG5hX3N0cmluZ3MpCmBgYAoKYGBge3IgfQpjYXQoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKQpjYXQoIlNFTEVDVElPTiBUSEUgU0hJWlpMRSIpCgpjYXQoIi0gc2FuaXR5IGNoZWNraW5nIFBSSU9SIHRvIHNlbGVjdGlvbiIpCmxpYnJhcnkoZGF0YS50YWJsZSkKcmVxdWlyZShsYWJlbGxlZCkKYWUuZ2VuZGVyIDwtIHRvX2ZhY3RvcihzY1JOQXNlcURhdGFNZXRhQUUkR2VuZGVyKQphZS5ob3NwaXRhbCA8LSB0b19mYWN0b3Ioc2NSTkFzZXFEYXRhTWV0YUFFJEhvc3BpdGFsKQp0YWJsZShhZS5nZW5kZXIsIGFlLmhvc3BpdGFsLCBkbm4gPSBjKCJTZXgiLCAiSG9zcGl0YWwiKSwgdXNlTkEgPSAiaWZhbnkiKQoKYWUuYXJ0ZXJ5IDwtIHRvX2ZhY3RvcihzY1JOQXNlcURhdGFNZXRhQUUkQXJ0ZXJ5X3N1bW1hcnkpCnRhYmxlKGFlLmFydGVyeSwgYWUuZ2VuZGVyLCBkbm4gPSBjKCJTZXgiLCAiQXJ0ZXJ5IiksIHVzZU5BID0gImlmYW55IikKCmFlLmljIDwtIHRvX2ZhY3RvcihzY1JOQXNlcURhdGFNZXRhQUUkaW5mb3JtZWRjb25zZW50KQp0YWJsZShhZS5pYywgYWUuZ2VuZGVyLCB1c2VOQSA9ICJpZmFueSIpCgpybShhZS5nZW5kZXIsIGFlLmhvc3BpdGFsLCBhZS5hcnRlcnksIGFlLmljKQoKCnNjUk5Bc2VxRGF0YU1ldGFBRS5hbGwgPC0gc3Vic2V0KHNjUk5Bc2VxRGF0YU1ldGFBRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFydGVyeV9zdW1tYXJ5ID09ICJjYXJvdGlkIChsZWZ0ICYgcmlnaHQpIiB8IEFydGVyeV9zdW1tYXJ5ID09ICJvdGhlciBjYXJvdGlkIGFydGVyaWVzIChjb21tb24sIGV4dGVybmFsKSIgKSAmICMgd2Ugb25seSB3YW50IGNhcm90aWRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJtaXNzaW5nIiAmICMgd2UgYXJlIHJlYWxseSBzdHJpY3QgaW4gc2VsZWN0aW5nIGJhc2VkIG9uICdpbmZvcm1lZCBjb25zZW50JyEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBkaWVkIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gY29tbWVyaWNhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gY29tbWVyaWNhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBoZWFsdGggdHJlYXRtZW50IiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIG1lZGljYWwgaW5mbyIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJjaWFsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJubywgZG9lc24ndCB3YW50IHRvIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJubywgdW5hYmxlIHRvIHNpZ24iICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBubyByZWFjdGlvbiIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGxvc3QiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCB0b28gb2xkIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIG1lZGljYWwgaW5mbywgaGVhbHRoIHRyZWF0bWVudCB3aGVuIHBvc3NpYmxlIiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8gKG5ldmVyIGFza2VkIGZvciBJQyBiZWNhdXNlIHRoZXJlIHdhcyBubyB0aXNzdWUpIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJubywgZW5kcG9pbnQiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vb2l0IGdlaW5jbHVkZWVyZCIgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gY29tbWVyY2lhbCBidXNpbmVzcyIgJiAjIElNUE9SVEFOVDogc2luY2Ugd2UgYXJlIHNoYXJpbmcgd2l0aCBhIGNvbW1lcmNpYWwgcGFydHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBjb21tZXJpY2FsIGJ1c2luZXNzIiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJjaWFsIGJ1c2luZXNzIiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJpY2FsIGJ1c2luZXNzIiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIG1lZGljYWwgaW5mbywgbm8gY29tbWVyY2lhbCBidXNpbmVzcyIgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gY29tbWVyaWNhbCBidXNpbmVzcyIgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgaGVhbHRoIHRyZWF0bWVudCB3aGVuIHBvc3NpYmxlLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzIiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzIiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyBxdWVzdGlvbm5haXJlcywgaGVhbHRoIHRyZWF0bWVudCB3aGVuIHBvc3NpYmxlLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzIiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAic2Vjb25kIGluZm9ybWVkIGNvbmNlbnRzOiB5ZXMsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiKQojIHNjUk5Bc2VxRGF0YU1ldGFBRS5hbGxbMToxMCwgMToxMF0KZGltKHNjUk5Bc2VxRGF0YU1ldGFBRS5hbGwpCiMgRFQ6OmRhdGF0YWJsZShzY1JOQXNlcURhdGFNZXRhQUUuYWxsKQoKYGBgCgojIyMgQmFzZWxpbmUKClNob3dpbmcgdGhlIGJhc2VsaW5lIHRhYmxlIGZvciB0aGUgc2NSTkFzZXEgZGF0YSBpbiAzOSBDRUEgcGF0aWVudHMgd2l0aAppbmZvcm1lZCBjb25zZW50LgoKYGBge3IgQmFzZWxpbmU6IFZpc3VhbGl6ZX0KY2F0KCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IikKY2F0KCJDUkVBVEUgQkFTRUxJTkUgVEFCTEUiKQoKIyBDcmVhdGUgYmFzZWxpbmUgdGFibGVzCiMgaHR0cDovL3JzdHVkaW8tcHVicy1zdGF0aWMuczMuYW1hem9uYXdzLmNvbS8xMzMyMV9kYTMxNDYzM2RiOTI0ZGM3ODk4NmE4NTA4MTNhNTBkNS5odG1sCnNjUk5Bc2VxRGF0YU1ldGFBRS5hbGwudGFibGVPbmUgPSBwcmludChDcmVhdGVUYWJsZU9uZSh2YXJzID0gYmFzZXRhYmxlX3ZhcnMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZmFjdG9yVmFycyA9IGJhc2V0YWJsZV9iaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdHJhdGEgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gc2NSTkFzZXFEYXRhTWV0YUFFLmFsbCwgaW5jbHVkZU5BID0gVFJVRSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbm5vcm1hbCA9IGMoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGUgPSBGQUxTRSwgc2hvd0FsbExldmVscyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gInAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250RGlnaXRzID0gMylbLDE6Ml0KCmBgYAoKV3JpdGluZyB0aGUgYmFzZWxpbmUgdGFibGUgdG8gRXhjZWwgZm9ybWF0LgoKYGBge3IgfQojIFdyaXRlIGJhc2V0YWJsZQpyZXF1aXJlKG9wZW54bHN4KQojIHdyaXRlLnhsc3goZmlsZSA9IHBhc3RlMChCQVNFTElORV9sb2MsICIvIixUb2RheSwiLiIsUFJPSkVDVE5BTUUsIi5BRVNDUk5BLkNFQS4zOXB0cy5hZnRlcl9xYy5JQ19jb21tZXJjaWFsLkJhc2VsaW5lVGFibGUueGxzeCIpLCAKIyAgICAgICAgICAgIGZvcm1hdChzY1JOQXNlcURhdGFNZXRhQUUuYWxsLnRhYmxlT25lLCBkaWdpdHMgPSA1LCBzY2llbnRpZmljID0gRkFMU0UpICwgCiMgICAgICAgICAgICByb3dOYW1lcyA9IFRSVUUsIGNvbE5hbWVzID0gVFJVRSwgb3ZlcndyaXRlID0gVFJVRSkKCndyaXRlLnhsc3goZmlsZSA9IHBhc3RlMChCQVNFTElORV9sb2MsICIvIixUb2RheSwiLiIsUFJPSkVDVE5BTUUsIi5BRVNDUk5BLkNFQS4zMnB0cy5hZnRlcl9xYy5JQ19hY2FkZW1pYy5CYXNlbGluZVRhYmxlLnhsc3giKSwgCiAgICAgICAgICAgZm9ybWF0KHNjUk5Bc2VxRGF0YU1ldGFBRS5hbGwudGFibGVPbmUsIGRpZ2l0cyA9IDUsIHNjaWVudGlmaWMgPSBGQUxTRSkgLCAKICAgICAgICAgICByb3dOYW1lcyA9IFRSVUUsIGNvbE5hbWVzID0gVFJVRSwgb3ZlcndyaXRlID0gVFJVRSkKCmBgYAoKIyBBRVNDUk5BCgojIyBRdWFsaXR5IGNvbnRyb2wKCkhlcmUgcmV2aWV3IHRoZSBudW1iZXIgb2YgY2VsbHMgcGVyIHNhbXBsZSwgcGxhdGUsIGFuZCBwYXRpZW50cy4gQW5kIHBsb3QgdGhlCnJhdGlvJ3MgcGVyIHNhbXBsZSBhbmQgc3R1ZHkgbnVtYmVyLgoKYGBge3IgUXVhbGl0eUNvbnRyb2x9CiMjIGNoZWNrIHN0dWZmCmNhdCgiXG5Ib3cgbWFueSBjZWxscyBwZXIgdHlwZSAuLi4/IikKc29ydCh0YWJsZShzY1JOQXNlcURhdGFAbWV0YS5kYXRhJFNDVF9zbm5fcmVzLjAuOCkpCgojIGNhdCgiXG5cbkhvdyBtYW55IGNlbGxzIHBlciBwbGF0ZSAuLi4/IikKIyBzb3J0KHRhYmxlKHNjUk5Bc2VxRGF0YUBtZXRhLmRhdGEkSUQpKQoKIyBjYXQoIlxuXG5Ib3cgbWFueSBjZWxscyBwZXIgdHlwZSBwZXIgcGxhdGUgLi4uPyIpCiMgdGFibGUoc2NSTkFzZXFEYXRhQG1ldGEuZGF0YSRTQ1Rfc25uX3Jlcy4wLjgsIHNjUk5Bc2VxRGF0YUBtZXRhLmRhdGEkSUQpCgpjYXQoIlxuXG5Ib3cgbWFueSBjZWxscyBwZXIgcGF0aWVudCAuLi4/IikKc29ydCh0YWJsZShzY1JOQXNlcURhdGFAbWV0YS5kYXRhJFBhdGllbnQpKQoKY2F0KCJcblxuVmlzdWFsaXppbmcgdGhlc2UgcmF0aW8ncyBwZXIgc3R1ZHkgbnVtYmVyIGFuZCBzYW1wbGUgLi4uPyIpClVNQVBQbG90KHNjUk5Bc2VxRGF0YSwgbGFiZWwgPSBUUlVFLCBwdC5zaXplID0gMS4yNSwgbGFiZWwuc2l6ZSA9IDQsIGdyb3VwLmJ5ID0gImlkZW50IiwKICAgICAgICAgcmVwZWwgPSBUUlVFKQpnZ3NhdmUocGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLlVNQVAucG5nIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKZ2dzYXZlKHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5VTUFQLnBzIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCgojIGJhcnBsb3QocHJvcC50YWJsZSh4ID0gdGFibGUoc2NSTkFzZXFEYXRhQGFjdGl2ZS5pZGVudCwgc2NSTkFzZXFEYXRhQG1ldGEuZGF0YSRQYXRpZW50KSksIAojICAgICAgICAgY2V4LmF4aXMgPSAxLjAsIGNleC5uYW1lcyA9IDAuNSwgbGFzID0gMSwKIyAgICAgICAgIGNvbCA9IHVpdGhvZl9jb2xvciwgeGxhYiA9ICJzdHVkeSBudW1iZXIiLCBsZWdlbmQudGV4dCA9IEZBTFNFLCBhcmdzLmxlZ2VuZCA9IGxpc3QoeCA9ICJib3R0b20iKSkKIyBkZXYuY29weShwZGYsIHBhc3RlMChRQ19sb2MsICIvIiwgVG9kYXksICIuY2VsbF9yYXRpb3NfcGVyX3NhbXBsZS5wZGYiKSkKIyBkZXYub2ZmKCkKCiMgYmFycGxvdChwcm9wLnRhYmxlKHggPSB0YWJsZShzY1JOQXNlcURhdGFAYWN0aXZlLmlkZW50LCBzY1JOQXNlcURhdGFAbWV0YS5kYXRhJElEKSksIAojICAgICAgICAgY2V4LmF4aXMgPSAxLjAsIGNleC5uYW1lcyA9IDAuNSwgbGFzID0gMiwKIyAgICAgICAgIGNvbCA9IHVpdGhvZl9jb2xvciwgeGxhYiA9ICJzYW1wbGUgSUQiLCBsZWdlbmQudGV4dCA9IEZBTFNFLCBhcmdzLmxlZ2VuZCA9IGxpc3QoeCA9ICJib3R0b20iKSkKIyBkZXYuY29weShwZGYsIHBhc3RlMChRQ19sb2MsICIvIiwgVG9kYXksICIuY2VsbF9yYXRpb3NfcGVyX3NhbXBsZV9wZXJfcGxhdGUucGRmIikpCiMgZGV2Lm9mZigpCgoKCmBgYAoKIyMgVmlzdWFsaXNhdGlvbnMKCkxldCdzIHByb2plY3Qga25vd24gY2VsbHVsYXIgbWFya2Vycy4KCmBgYHtyIFZpc3VhbGlzYXRpb246IHRTTkUgRXhwbG9yYXRpb259CgpVTUFQUGxvdChzY1JOQXNlcURhdGEsIGxhYmVsID0gRkFMU0UsIHB0LnNpemUgPSAxLjI1LCBsYWJlbC5zaXplID0gNCwgZ3JvdXAuYnkgPSAiaWRlbnQiLAogICAgICAgICByZXBlbCA9IFRSVUUpCgojIGVuZG90aGVsaWFsIGNlbGxzCkZlYXR1cmVQbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBjKCJDRDM0IiksIGNvbHMgPSAgYygiI0VDRUNFQyIsICIjREIwMDNGIikpCkZlYXR1cmVQbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBjKCJFRE4xIiksIGNvbHMgPSAgYygiI0VDRUNFQyIsICIjREIwMDNGIikpCkZlYXR1cmVQbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBjKCJFRE5SQSIsICJFRE5SQiIpLCBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIpKQpGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYygiQ0RINSIsICJQRUNBTTEiKSwgY29scyA9ICBjKCIjRUNFQ0VDIiwgIiNEQjAwM0YiKSkKRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IGMoIkFDS1IxIiksIGNvbHMgPSAgYygiI0VDRUNFQyIsICIjREIwMDNGIikpCgojIFNNQwpGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYygiTVlIMTEiKSwgY29scyA9ICBjKCIjRUNFQ0VDIiwgIiNEQjAwM0YiKSkKRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IGMoIkxHQUxTMyIsICJBQ1RBMiIpLCBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIpKQoKIyBtYWNyb3BoYWdlcwpGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYygiQ0QxNCIsICJDRDY4IiksIGNvbHMgPSAgYygiI0VDRUNFQyIsICIjREIwMDNGIikpCkZlYXR1cmVQbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBjKCJDRDM2IiksIGNvbHMgPSAgYygiI0VDRUNFQyIsICIjREIwMDNGIikpCgojIHQtY2VsbHMKRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IGMoIkNEM0UiKSwgY29scyA9ICBjKCIjRUNFQ0VDIiwgIiNEQjAwM0YiKSkKRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IGMoIkNENCIpLCBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIpKQojIEZlYXR1cmVQbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBjKCJDRDgiKSwgY29scyA9ICBjKCIjRUNFQ0VDIiwgIiNEQjAwM0YiKSkKCiMgYi1jZWxscwpGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYygiQ0Q3OUEiKSwgY29scyA9ICBjKCIjRUNFQ0VDIiwgIiNEQjAwM0YiKSkKCiMgbWFzdCBjZWxscwpGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYygiS0lUIiksIGNvbHMgPSAgYygiI0VDRUNFQyIsICIjREIwMDNGIikpCgojIE5LIGNlbGxzCkZlYXR1cmVQbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBjKCJOQ0FNMSIpLCBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIpKQoKYGBgCgojIyBUYXJnZXRzIG9mIGludGVyZXN0OgoKV2UgY2hlY2sgd2hldGhlciB0aGUgdGFyZ2V0cyBnZW5lcyB3ZXJlIHNlcXVlbmNlZCB1c2luZyBvdXIgbWV0aG9kLgoKYGBge3IgbGlzdCB0YXJnZXQgZ2VuZXN9Cmxlbmd0aCh0YXJnZXRfZ2VuZXMpCnRhcmdldF9nZW5lcwoKYGBgCgojIyMgRXhwcmVzc2lvbiBpbiBjZWxsIGNvbW11bml0aWVzCgpgYGB7ciBWaXN1YWxpc2F0aW9uOiBwcmVwYXJhdGlvbn0KCiMgdGFyZ2V0X2dlbmVzX3JtIDwtIGMoIkFDMDExMjk0LjMiLCAiQzZvcmYxOTUiLCAiQzlvcmY1MyIsICJBTDEzNzAyNi4xIiwgIlJQMTEtMTQ1RTUuNSIsCiMgICAgICAgICAgICAgICAgICAgICAgIlpORjMyIiwgIkJDQU0iLCAiRFVQRDEiLCAiUFZSTDIiKQojIAojIHRlbXAgPSB0YXJnZXRfZ2VuZXNbIXRhcmdldF9nZW5lcyAlaW4lIHRhcmdldF9nZW5lc19ybV0KIyAKIyB0YXJnZXRfZ2VuZXNfcWMgPC0gYyh0ZW1wLCAiRFVTUDI3IiwgIk5FQ1RJTjIiKQoKdGFyZ2V0X2dlbmVzX3FjIDwtIHRhcmdldF9nZW5lcwp0YXJnZXRfZ2VuZXNfcWMKYGBgCgpgYGB7ciBWaXN1YWxpc2F0aW9uOiBUYXJnZXRzIEZlYXR1cmUgYW5kIERvdCBQbG90cywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShSQ29sb3JCcmV3ZXIpCgpwMSA8LSBEb3RQbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSB0YXJnZXRfZ2VuZXNfcWMsCiAgICAgICAgY29scyA9ICJSZEJ1IikKCnAxICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3Q9MSwgc2l6ZSA9IDUpKQoKZ2dzYXZlKHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5Eb3RQbG90LlRhcmdldHMucG5nIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKZ2dzYXZlKHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5Eb3RQbG90LlRhcmdldHMucHMiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQpnZ3NhdmUocGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLkRvdFBsb3QuVGFyZ2V0cy5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKcm0ocDEpCgojIEZlYXR1cmVQbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBjKHRhcmdldF9nZW5lc19xYyksCiMgICAgICAgICAgICAgY29scyA9ICBjKCIjRUNFQ0VDIiwgIiNEQjAwM0YiLCAiIzlBMzQ4MCIsIiMxMjkwRDkiKSwKIyAgICAgICAgICAgICBjb21iaW5lID0gVFJVRSkKIyAKIyBnZ3NhdmUocGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLkZlYXR1cmVQbG90LlRhcmdldHMucG5nIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKIyBnZ3NhdmUocGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLkZlYXR1cmVQbG90LlRhcmdldHMucHMiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKCmBgYAoKYGBge3IgVmlzdWFsaXNhdGlvbjogVGFyZ2V0c30KIyBWbG5QbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSAiRFVTUDI3IikKCiMgVmxuUGxvdCBmaWxlcwppZmVsc2UoIWRpci5leGlzdHMoZmlsZS5wYXRoKFBMT1RfbG9jLCAiL1ZsblBsb3QiKSksIAogICAgICAgZGlyLmNyZWF0ZShmaWxlLnBhdGgoUExPVF9sb2MsICIvVmxuUGxvdCIpKSwgCiAgICAgICBGQUxTRSkKVmxuUGxvdF9sb2MgPSBwYXN0ZTAoUExPVF9sb2MsICIvVmxuUGxvdCIpCgoKZm9yIChHRU5FIGluIHRhcmdldF9nZW5lc19xYyl7CiAgcHJpbnQocGFzdGUwKCJQcm9qZWN0aW5nIHRoZSBleHByZXNzaW9uIG9mICIsIEdFTkUsICIuIikpCgogIHZwMSA8LSAgVmxuUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gR0VORSkgKyAKICAgIHhsYWIoImNlbGwgY29tbXVuaXRpZXMiKSArIAogICAgeWxhYihicXVvdGUoIm5vcm1hbGl6ZWQgZXhwcmVzc2lvbiIpKSArCiAgICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiIzAwMDAwMCIsIHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIiksIAogICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiIzAwMDAwMCIsIHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIiksIAogICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCiAgICBnZ3NhdmUocGFzdGUwKFZsblBsb3RfbG9jLCAiLyIsIFRvZGF5LCAiLlZsblBsb3QuIixHRU5FLCIucG5nIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKICAgIGdnc2F2ZShwYXN0ZTAoVmxuUGxvdF9sb2MsICIvIiwgVG9kYXksICIuVmxuUGxvdC4iLEdFTkUsIi5wcyIpLCBwbG90ID0gbGFzdF9wbG90KCkpCiAgICBnZ3NhdmUocGFzdGUwKFZsblBsb3RfbG9jLCAiLyIsIFRvZGF5LCAiLlZsblBsb3QuIixHRU5FLCIucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKICAKICAjIHByaW50KHZwMSkKICAKfQoKYGBgCgojIyMgRGlmZmVyZW50aWFsIGV4cHJlc3Npb24gYmV0d2VlbiBjZWxsIGNvbW11bml0aWVzCgpIZXJlIHdlIHByb2plY3QgZ2VuZXMgdG8gb25seSB0aGUgYnJvYWQgY2VsbCBjb21tdW5pdGllczoKCi0gICBtYWNyb3BoYWdlcwotICAgZW5kb3RoZWxpYWwgY2VsbHMKLSAgIHNtb290aCBtdXNjbGUgY2VsbHMKLSAgIFQtY2VsbHMKLSAgIEItY2VsbHMKLSAgIE1hc3QgY2VsbHMKLSAgIE5LLWNlbGxzCi0gICBNaXhlZCBjZWxscwoKIyMjIyBNYWNyb3BoYWdlcwoKYGBge3J9CnVuaXF1ZShzY1JOQXNlcURhdGFAYWN0aXZlLmlkZW50KQpgYGAKCkNvbXBhcmlzb24gYmV0d2VlbiB0aGUgbWFjcm9waGFnZXMgY2VsbCBjb21tdW5pdGllcyAoKkNEMTQvQ0Q2OCo8c3VwPis8L3N1cD4pLAphbmQgYWxsIG90aGVyIGNvbW11bml0aWVzLgoKYGBge3IgVmlzdWFsaXNhdGlvbjogVm9sY2FubyBNQUMgY2FsY3VsYXRlfQoKTUFDLm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gc2NSTkFzZXFEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xID0gYygiQ0Q2OCtDQVNQMStJTDFCK1NFTEwgTUluZiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDY4K0NEMUMrIERDIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENjgrQ0Q0KyBNb25vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q2OCtJTDE4K1RMUjQrVFJFTTIrIE1SZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDY4K0FCQ0ExK09MUjErVFJFTTIrIEZDIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjIgPSBjKCMiQ0Q2OCtDQVNQMStJTDFCK1NFTEwgTUluZiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMiQ0Q2OCtDRDFDKyBEQyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMiQ0Q2OCtDRDQrIE1vbm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMiQ0Q2OCtJTDE4K1RMUjQrVFJFTTIrIE1SZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMiQ0Q2OCtBQkNBMStPTFIxK1RSRU0yKyBGQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBJSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBJViIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRDIFYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBWSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGT1hQMysgVEMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzNCsgRUMgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDM0KyBFQyBJSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFDVEEyKyBTTUMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENTYrIE5LIEkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q1NisgTksgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q2OCtLSVQrIE1DIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q3OSsgQkNwbGFzbWEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q3OUErIEJDbWVtIikpCgpEVDo6ZGF0YXRhYmxlKE1BQy5tYXJrZXJzKQpgYGAKCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gTUFDLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpNQUNfVm9sY2Fub19UYXJnZXRzQSA9IEVuaGFuY2VkVm9sY2FubyhNQUMubWFya2VycywKICAgIGxhYiA9IHJvd25hbWVzKE1BQy5tYXJrZXJzKSwKICAgIHggPSAiYXZnX2xvZzJGQyIsCiAgICB5ID0gInBfdmFsX2FkaiIsCiAgICBzZWxlY3RMYWIgPSB0YXJnZXRfZ2VuZXNfcWMsCiAgICBheGlzTGFiU2l6ZSA9IDEyLAogICAgeGxhYiA9ICJhdmVyYWdlIGZvbGQtY2hhbmdlIiwKICAgIHRpdGxlID0gIk1hY3JvcGhhZ2UgbWFya2Vyc1xuKE1hY3JvcGhhZ2UgY29tbXVuaXRpZXMgdnMgdGhlIHJlc3QpIiwKICAgIHRpdGxlTGFiU2l6ZSA9IDE0LAogICAgcEN1dG9mZiA9IDAuMDUvKG5yb3coTUFDLm1hcmtlcnMpKSwgIyAyMDU1MiBnZW5lcwogICAgRkNjdXRvZmYgPSAxLjI1LAogICAgcG9pbnRTaXplID0gMS41LAogICAgbGFiU2l6ZSA9IDMuMCwKICAgIGxlZ2VuZExhYmVscyA9YygnTlMnLCdhdmcuIGZvbGQtY2hhbmdlJywnUCcsCiAgICAgICdQICYgYXZnLiBmb2xkLWNoYW5nZScpLAogICAgbGVnZW5kUG9zaXRpb24gPSAicmlnaHQiLAogICAgbGVnZW5kTGFiU2l6ZSA9IDEwLAogICAgbGVnZW5kSWNvblNpemUgPSAzLjAsCiAgICBkcmF3Q29ubmVjdG9ycyA9IFRSVUUsCiAgICB3aWR0aENvbm5lY3RvcnMgPSAwLjIsCiAgICBjb2xDb25uZWN0b3JzID0gIiM1OTVBNUMiLAogICAgZ3JpZGxpbmVzLm1ham9yID0gRkFMU0UsCiAgICBncmlkbGluZXMubWlub3IgPSBGQUxTRSkKTUFDX1ZvbGNhbm9fVGFyZ2V0c0EKZ2dzYXZlKHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5Wb2xjYW5vLk1BQy5ERUcuVGFyZ2V0cy5wZGYiKSwgCiAgICAgICBwbG90ID0gTUFDX1ZvbGNhbm9fVGFyZ2V0c0EpCmBgYAoKVGhlIHRhcmdldCByZXN1bHRzIGFyZSBnaXZlbiBiZWxvdyBhbmQgd3JpdHRlbiB0byBhIGZpbGUuCgpgYGB7ciBSZXN1bHRzIE1BQ30KbGlicmFyeSh0aWJibGUpCk1BQy5tYXJrZXJzIDwtIGFkZF9jb2x1bW4oTUFDLm1hcmtlcnMsIEdlbmUgPSByb3cubmFtZXMoTUFDLm1hcmtlcnMpLCAuYmVmb3JlID0gMSkKCnRlbXAgPC0gTUFDLm1hcmtlcnNbTUFDLm1hcmtlcnMkR2VuZSAlaW4lIHRhcmdldF9nZW5lc19xYyxdCgpEVDo6ZGF0YXRhYmxlKHRlbXApCmBgYAoKYGBge3IgUmVzdWx0cyBNQUM6IHdyaXRpbmd9CmZ3cml0ZSh0ZW1wLCBmaWxlID0gcGFzdGUwKE9VVF9sb2MsICIvIiwgVG9kYXksICIuTUFDLkRFRy5UYXJnZXRzLnR4dCIpLAogICAgICAgcXVvdGUgPSBGQUxTRSwKICAgICAgIHNlcCA9ICJcdCIsIAogICAgICAgc2hvd1Byb2dyZXNzID0gRkFMU0UsIHZlcmJvc2UgPSBGQUxTRSkKYGBgCgojIyMjIFNtb290aCBtdXNjbGUgY2VsbHMKCkNvbXBhcmlzb24gYmV0d2VlbiB0aGUgc21vb3RoIG11c2NsZSBjZWxsIGNvbW11bml0aWVzICgqQUNUQTIqPHN1cD4rPC9zdXA+KSwgYW5kCmFsbCBvdGhlciBjb21tdW5pdGllcy4KCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gU01DIGNhbGN1bGF0ZX0KClNNQy5tYXJrZXJzIDwtIEZpbmRNYXJrZXJzKG9iamVjdCA9IHNjUk5Bc2VxRGF0YSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMSA9IGMoIkFDVEEyKyBTTUMiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMiA9IGMoIkNENjgrQ0FTUDErSUwxQitTRUxMIE1JbmYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q2OCtDRDFDKyBEQyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDY4K0NENCsgTW9ubyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENjgrSUwxOCtUTFI0K1RSRU0yKyBNUmVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q2OCtBQkNBMStPTFIxK1RSRU0yKyBGQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBJSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBJViIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRDIFYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBWSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGT1hQMysgVEMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzNCsgRUMgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDM0KyBFQyBJSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyJBQ1RBMisgU01DIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDU2KyBOSyBJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENTYrIE5LIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENjgrS0lUKyBNQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENzkrIEJDcGxhc21hIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENzlBKyBCQ21lbSIpKQoKRFQ6OmRhdGF0YWJsZShTTUMubWFya2VycykKYGBgCgpgYGB7ciBWaXN1YWxpc2F0aW9uOiBWb2xjYW5vIFNNQywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KU01DX1ZvbGNhbm9fVGFyZ2V0c0EgPSBFbmhhbmNlZFZvbGNhbm8oU01DLm1hcmtlcnMsCiAgICBsYWIgPSByb3duYW1lcyhTTUMubWFya2VycyksCiAgICB4ID0gImF2Z19sb2cyRkMiLAogICAgeSA9ICJwX3ZhbF9hZGoiLAogICAgc2VsZWN0TGFiID0gdGFyZ2V0X2dlbmVzX3FjLAogICAgYXhpc0xhYlNpemUgPSAxMiwKICAgIHhsYWIgPSAiYXZlcmFnZSBmb2xkLWNoYW5nZSIsCiAgICB0aXRsZSA9ICJTTUMgbWFya2Vyc1xuKFNNQyBjb21tdW5pdGllcyB2cyB0aGUgcmVzdCkiLAogICAgdGl0bGVMYWJTaXplID0gMTQsCiAgICBwQ3V0b2ZmID0gMC4wNS8obnJvdyhTTUMubWFya2VycykpLCAjIDIwNTUyIGdlbmVzCiAgICBGQ2N1dG9mZiA9IDEuMjUsCiAgICBwb2ludFNpemUgPSAxLjUsCiAgICBsYWJTaXplID0gMy4wLAogICAgbGVnZW5kTGFiZWxzID1jKCdOUycsJ2F2Zy4gZm9sZC1jaGFuZ2UnLCdQJywKICAgICAgJ1AgJiBhdmcuIGZvbGQtY2hhbmdlJyksCiAgICBsZWdlbmRQb3NpdGlvbiA9ICJyaWdodCIsCiAgICBsZWdlbmRMYWJTaXplID0gMTAsCiAgICBsZWdlbmRJY29uU2l6ZSA9IDMuMCwKICAgIGRyYXdDb25uZWN0b3JzID0gVFJVRSwKICAgIHdpZHRoQ29ubmVjdG9ycyA9IDAuMiwKICAgIGNvbENvbm5lY3RvcnMgPSAiIzU5NUE1QyIsCiAgICBncmlkbGluZXMubWFqb3IgPSBGQUxTRSwKICAgIGdyaWRsaW5lcy5taW5vciA9IEZBTFNFKQpTTUNfVm9sY2Fub19UYXJnZXRzQQpnZ3NhdmUocGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLlZvbGNhbm8uU01DLkRFRy5UYXJnZXRzLnBkZiIpLCAKICAgICAgIHBsb3QgPSBTTUNfVm9sY2Fub19UYXJnZXRzQSkKYGBgCgpUaGUgdGFyZ2V0IHJlc3VsdHMgYXJlIGdpdmVuIGJlbG93IGFuZCB3cml0dGVuIHRvIGEgZmlsZS4KCmBgYHtyIFJlc3VsdHMgU01DfQpsaWJyYXJ5KHRpYmJsZSkKU01DLm1hcmtlcnMgPC0gYWRkX2NvbHVtbihTTUMubWFya2VycywgR2VuZSA9IHJvdy5uYW1lcyhTTUMubWFya2VycyksIC5iZWZvcmUgPSAxKQoKdGVtcCA8LSBTTUMubWFya2Vyc1tTTUMubWFya2VycyRHZW5lICVpbiUgdGFyZ2V0X2dlbmVzX3FjLF0KCkRUOjpkYXRhdGFibGUodGVtcCkKYGBgCgpgYGB7ciBSZXN1bHRzIFNNQzogd3JpdGluZ30KZndyaXRlKHRlbXAsIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLCBUb2RheSwgIi5TTUMuREVHLlRhcmdldHMudHh0IiksCiAgICAgICBxdW90ZSA9IEZBTFNFLAogICAgICAgc2VwID0gIlx0IiwgCiAgICAgICBzaG93UHJvZ3Jlc3MgPSBGQUxTRSwgdmVyYm9zZSA9IEZBTFNFKQpgYGAKCiMjIyMgRW5kb3RoZWxpYWwgY2VsbHMKCkNvbXBhcmlzb24gYmV0d2VlbiB0aGUgZW5kb3RoZWxpYWwgY2VsbCBjb21tdW5pdGllcyAoKkNEMzQqPHN1cD4rPC9zdXA+KSwgYW5kCmFsbCBvdGhlciBjb21tdW5pdGllcy4KCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gRUMgY2FsY3VsYXRlfQoKRUMubWFya2VycyA8LSBGaW5kTWFya2VycyhvYmplY3QgPSBzY1JOQXNlcURhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjEgPSBjKCJDRDM0KyBFQyBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMzQrIEVDIElJIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjIgPSBjKCJDRDY4K0NBU1AxK0lMMUIrU0VMTCBNSW5mIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENjgrQ0QxQysgREMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q2OCtDRDQrIE1vbm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDY4K0lMMTgrVExSNCtUUkVNMisgTVJlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENjgrQUJDQTErT0xSMStUUkVNMisgRkMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRDIEkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRDIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgSUlJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgSVYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBWIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgVkkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRk9YUDMrIFRDIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAiQ0QzNCsgRUMgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIkNEMzQrIEVDIElJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUNUQTIrIFNNQyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q1NisgTksgSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDU2KyBOSyBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDY4K0tJVCsgTUMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDc5KyBCQ3BsYXNtYSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDc5QSsgQkNtZW0iKSkKCkRUOjpkYXRhdGFibGUoRUMubWFya2VycykKYGBgCgpgYGB7ciBWaXN1YWxpc2F0aW9uOiBWb2xjYW5vIEVDLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpFQ19Wb2xjYW5vX1RhcmdldHNBID0gRW5oYW5jZWRWb2xjYW5vKEVDLm1hcmtlcnMsCiAgICBsYWIgPSByb3duYW1lcyhFQy5tYXJrZXJzKSwKICAgIHggPSAiYXZnX2xvZzJGQyIsCiAgICB5ID0gInBfdmFsX2FkaiIsCiAgICBzZWxlY3RMYWIgPSB0YXJnZXRfZ2VuZXNfcWMsCiAgICBheGlzTGFiU2l6ZSA9IDEyLAogICAgeGxhYiA9ICJhdmVyYWdlIGZvbGQtY2hhbmdlIiwKICAgIHRpdGxlID0gIkVuZG90aGVsaWFsIGNlbGwgbWFya2Vyc1xuKEVDIGNvbW11bml0aWVzIHZzIHRoZSByZXN0KSIsCiAgICB0aXRsZUxhYlNpemUgPSAxNCwKICAgIHBDdXRvZmYgPSAwLjA1Lyhucm93KEVDLm1hcmtlcnMpKSwgIyAyMDU1MiBnZW5lcwogICAgRkNjdXRvZmYgPSAxLjI1LAogICAgcG9pbnRTaXplID0gMS41LAogICAgbGFiU2l6ZSA9IDMuMCwKICAgIGxlZ2VuZExhYmVscyA9YygnTlMnLCdhdmcuIGZvbGQtY2hhbmdlJywnUCcsCiAgICAgICdQICYgYXZnLiBmb2xkLWNoYW5nZScpLAogICAgbGVnZW5kUG9zaXRpb24gPSAicmlnaHQiLAogICAgbGVnZW5kTGFiU2l6ZSA9IDEwLAogICAgbGVnZW5kSWNvblNpemUgPSAzLjAsCiAgICBkcmF3Q29ubmVjdG9ycyA9IFRSVUUsCiAgICB3aWR0aENvbm5lY3RvcnMgPSAwLjIsCiAgICBjb2xDb25uZWN0b3JzID0gIiM1OTVBNUMiLAogICAgZ3JpZGxpbmVzLm1ham9yID0gRkFMU0UsCiAgICBncmlkbGluZXMubWlub3IgPSBGQUxTRSkKRUNfVm9sY2Fub19UYXJnZXRzQQpnZ3NhdmUocGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLlZvbGNhbm8uRUMuREVHLlRhcmdldHMucGRmIiksIAogICAgICAgcGxvdCA9IEVDX1ZvbGNhbm9fVGFyZ2V0c0EpCmBgYAoKVGhlIHRhcmdldCByZXN1bHRzIGFyZSBnaXZlbiBiZWxvdyBhbmQgd3JpdHRlbiB0byBhIGZpbGUuCgpgYGB7ciBSZXN1bHRzIEVDfQpsaWJyYXJ5KHRpYmJsZSkKRUMubWFya2VycyA8LSBhZGRfY29sdW1uKEVDLm1hcmtlcnMsIEdlbmUgPSByb3cubmFtZXMoRUMubWFya2VycyksIC5iZWZvcmUgPSAxKQoKdGVtcCA8LSBFQy5tYXJrZXJzW0VDLm1hcmtlcnMkR2VuZSAlaW4lIHRhcmdldF9nZW5lc19xYyxdCgpEVDo6ZGF0YXRhYmxlKHRlbXApCmBgYAoKYGBge3IgUmVzdWx0cyBFQzogd3JpdGluZ30KZndyaXRlKHRlbXAsIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLCBUb2RheSwgIi5FQy5ERUcuVGFyZ2V0cy50eHQiKSwKICAgICAgIHF1b3RlID0gRkFMU0UsCiAgICAgICBzZXAgPSAiXHQiLCAKICAgICAgIHNob3dQcm9ncmVzcyA9IEZBTFNFLCB2ZXJib3NlID0gRkFMU0UpCmBgYAoKIyMjIyBULWNlbGxzCgpDb21wYXJpc29uIGJldHdlZW4gdGhlIFQtY2VsbCBjb21tdW5pdGllcyAoKkNEMy9DRDQvQ0Q4KjxzdXA+Kzwvc3VwPiksIGFuZCBhbGwKb3RoZXIgY29tbXVuaXRpZXMuCgpgYGB7ciBWaXN1YWxpc2F0aW9uOiBWb2xjYW5vIFRjZWxsIGNhbGN1bGF0ZX0KClRDLm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gc2NSTkFzZXFEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xID0gYygiQ0QzKyBUQyBJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRDIElJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRDIElWIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgViIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRDIFZJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZPWFAzKyBUQyIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4yID0gYygiQ0Q2OCtDQVNQMStJTDFCK1NFTEwgTUluZiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDY4K0NEMUMrIERDIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENjgrQ0Q0KyBNb25vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q2OCtJTDE4K1RMUjQrVFJFTTIrIE1SZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDY4K0FCQ0ExK09MUjErVFJFTTIrIEZDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJDRDMrIFRDIEkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIkNEMysgVEMgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJDRDMrIFRDIElJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIkNEMysgVEMgSVYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJDRDMrIFRDIFYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJDRDMrIFRDIFZJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAiRk9YUDMrIFRDIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMzQrIEVDIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzNCsgRUMgSUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBQ1RBMisgU01DIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDU2KyBOSyBJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENTYrIE5LIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENjgrS0lUKyBNQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENzkrIEJDcGxhc21hIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENzlBKyBCQ21lbSIpKQoKRFQ6OmRhdGF0YWJsZShUQy5tYXJrZXJzKQpgYGAKCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gVGNlbGwsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9ClRDX1ZvbGNhbm9fVGFyZ2V0c0EgPSBFbmhhbmNlZFZvbGNhbm8oVEMubWFya2VycywKICAgIGxhYiA9IHJvd25hbWVzKFRDLm1hcmtlcnMpLAogICAgeCA9ICJhdmdfbG9nMkZDIiwKICAgIHkgPSAicF92YWxfYWRqIiwKICAgIHNlbGVjdExhYiA9IHRhcmdldF9nZW5lc19xYywKICAgIGF4aXNMYWJTaXplID0gMTIsCiAgICB4bGFiID0gImF2ZXJhZ2UgZm9sZC1jaGFuZ2UiLAogICAgdGl0bGUgPSAiVC1jZWxsIG1hcmtlcnNcbihULWNlbGwgY29tbXVuaXRpZXMgdnMgdGhlIHJlc3QpIiwKICAgIHRpdGxlTGFiU2l6ZSA9IDE0LAogICAgcEN1dG9mZiA9IDAuMDUvbnJvdyhUQy5tYXJrZXJzKSwgIyAyMDU1MiBnZW5lcwogICAgRkNjdXRvZmYgPSAxLjI1LAogICAgcG9pbnRTaXplID0gMS41LAogICAgbGFiU2l6ZSA9IDMuMCwKICAgIGxlZ2VuZExhYmVscyA9YygnTlMnLCdhdmcuIGZvbGQtY2hhbmdlJywnUCcsCiAgICAgICdQICYgYXZnLiBmb2xkLWNoYW5nZScpLAogICAgbGVnZW5kUG9zaXRpb24gPSAicmlnaHQiLAogICAgbGVnZW5kTGFiU2l6ZSA9IDEwLAogICAgbGVnZW5kSWNvblNpemUgPSAzLjAsCiAgICBkcmF3Q29ubmVjdG9ycyA9IFRSVUUsCiAgICB3aWR0aENvbm5lY3RvcnMgPSAwLjIsCiAgICBjb2xDb25uZWN0b3JzID0gIiM1OTVBNUMiLAogICAgZ3JpZGxpbmVzLm1ham9yID0gRkFMU0UsCiAgICBncmlkbGluZXMubWlub3IgPSBGQUxTRSkKVENfVm9sY2Fub19UYXJnZXRzQQpnZ3NhdmUocGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLlZvbGNhbm8uVEMuREVHLlRhcmdldHMucGRmIiksIAogICAgICAgcGxvdCA9IFRDX1ZvbGNhbm9fVGFyZ2V0c0EpCmBgYAoKVGhlIHRhcmdldCByZXN1bHRzIGFyZSBnaXZlbiBiZWxvdyBhbmQgd3JpdHRlbiB0byBhIGZpbGUuCgpgYGB7ciBSZXN1bHRzIFRDfQpsaWJyYXJ5KHRpYmJsZSkKVEMubWFya2VycyA8LSBhZGRfY29sdW1uKFRDLm1hcmtlcnMsIEdlbmUgPSByb3cubmFtZXMoVEMubWFya2VycyksIC5iZWZvcmUgPSAxKQoKdGVtcCA8LSBUQy5tYXJrZXJzW1RDLm1hcmtlcnMkR2VuZSAlaW4lIHRhcmdldF9nZW5lc19xYyxdCgpEVDo6ZGF0YXRhYmxlKHRlbXApCmBgYAoKYGBge3IgUmVzdWx0cyBUQzogd3JpdGluZ30KZndyaXRlKHRlbXAsIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLCBUb2RheSwgIi5UQy5ERUcuVGFyZ2V0cy50eHQiKSwKICAgICAgIHF1b3RlID0gRkFMU0UsCiAgICAgICBzZXAgPSAiXHQiLCAKICAgICAgIHNob3dQcm9ncmVzcyA9IEZBTFNFLCB2ZXJib3NlID0gRkFMU0UpCmBgYAoKIyMjIyBCLWNlbGxzCgpDb21wYXJpc29uIGJldHdlZW4gdGhlIEItY2VsbCBjb21tdW5pdGllcyAoKkNENzlBKjxzdXA+Kzwvc3VwPiksIGFuZCBhbGwgb3RoZXIKY29tbXVuaXRpZXMuCgpgYGB7ciBWaXN1YWxpc2F0aW9uOiBWb2xjYW5vIEJjZWxsIGNhbGN1bGF0ZX0KCkJDLm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gc2NSTkFzZXFEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xID0gYygiQ0Q3OSsgQkNwbGFzbWEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q3OUErIEJDbWVtIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjIgPSBjKCJDRDY4K0NBU1AxK0lMMUIrU0VMTCBNSW5mIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENjgrQ0QxQysgREMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q2OCtDRDQrIE1vbm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDY4K0lMMTgrVExSNCtUUkVNMisgTVJlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENjgrQUJDQTErT0xSMStUUkVNMisgRkMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRDIEkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRDIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgSUlJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgSVYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBWIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgVkkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRk9YUDMrIFRDIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMzQrIEVDIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzNCsgRUMgSUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBQ1RBMisgU01DIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDU2KyBOSyBJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENTYrIE5LIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENjgrS0lUKyBNQyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJDRDc5KyBCQ3BsYXNtYSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIkNENzlBKyBCQ21lbSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQoKRFQ6OmRhdGF0YWJsZShCQy5tYXJrZXJzKQpgYGAKCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gQmNlbGwsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkJDX1ZvbGNhbm9fVGFyZ2V0c0EgPSBFbmhhbmNlZFZvbGNhbm8oQkMubWFya2VycywKICAgIGxhYiA9IHJvd25hbWVzKEJDLm1hcmtlcnMpLAogICAgeCA9ICJhdmdfbG9nMkZDIiwKICAgIHkgPSAicF92YWxfYWRqIiwKICAgIHNlbGVjdExhYiA9IHRhcmdldF9nZW5lc19xYywKICAgIGF4aXNMYWJTaXplID0gMTIsCiAgICB4bGFiID0gImF2ZXJhZ2UgZm9sZC1jaGFuZ2UiLAogICAgdGl0bGUgPSAiQi1jZWxsIG1hcmtlcnNcbihCLWNlbGwgY29tbXVuaXRpZXMgdnMgdGhlIHJlc3QpIiwKICAgIHRpdGxlTGFiU2l6ZSA9IDE0LAogICAgcEN1dG9mZiA9IDAuMDUvbnJvdyhCQy5tYXJrZXJzKSwgIyAyMDU1MiBnZW5lcwogICAgRkNjdXRvZmYgPSAxLjI1LAogICAgcG9pbnRTaXplID0gMS41LAogICAgbGFiU2l6ZSA9IDMuMCwKICAgIGxlZ2VuZExhYmVscyA9YygnTlMnLCdhdmcuIGZvbGQtY2hhbmdlJywnUCcsCiAgICAgICdQICYgYXZnLiBmb2xkLWNoYW5nZScpLAogICAgbGVnZW5kUG9zaXRpb24gPSAicmlnaHQiLAogICAgbGVnZW5kTGFiU2l6ZSA9IDEwLAogICAgbGVnZW5kSWNvblNpemUgPSAzLjAsCiAgICBkcmF3Q29ubmVjdG9ycyA9IFRSVUUsCiAgICB3aWR0aENvbm5lY3RvcnMgPSAwLjIsCiAgICBjb2xDb25uZWN0b3JzID0gIiM1OTVBNUMiLAogICAgZ3JpZGxpbmVzLm1ham9yID0gRkFMU0UsCiAgICBncmlkbGluZXMubWlub3IgPSBGQUxTRSkKQkNfVm9sY2Fub19UYXJnZXRzQQpnZ3NhdmUocGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLlZvbGNhbm8uQkMuREVHLlRhcmdldHMucGRmIiksIAogICAgICAgcGxvdCA9IEJDX1ZvbGNhbm9fVGFyZ2V0c0EpCmBgYAoKVGhlIHRhcmdldCByZXN1bHRzIGFyZSBnaXZlbiBiZWxvdyBhbmQgd3JpdHRlbiB0byBhIGZpbGUuCgpgYGB7ciBSZXN1bHRzIEJDfQpsaWJyYXJ5KHRpYmJsZSkKQkMubWFya2VycyA8LSBhZGRfY29sdW1uKEJDLm1hcmtlcnMsIEdlbmUgPSByb3cubmFtZXMoQkMubWFya2VycyksIC5iZWZvcmUgPSAxKQoKdGVtcCA8LSBCQy5tYXJrZXJzW0JDLm1hcmtlcnMkR2VuZSAlaW4lIHRhcmdldF9nZW5lc19xYyxdCgpEVDo6ZGF0YXRhYmxlKHRlbXApCmBgYAoKYGBge3IgUmVzdWx0cyBCQzogd3JpdGluZ30KZndyaXRlKHRlbXAsIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLCBUb2RheSwgIi5CQy5ERUcuVGFyZ2V0cy50eHQiKSwKICAgICAgIHF1b3RlID0gRkFMU0UsCiAgICAgICBzZXAgPSAiXHQiLCAKICAgICAgIHNob3dQcm9ncmVzcyA9IEZBTFNFLCB2ZXJib3NlID0gRkFMU0UpCmBgYAoKIyMjIyBNYXN0IGNlbGxzCgpDb21wYXJpc29uIGJldHdlZW4gdGhlIG1hc3QgY2VsbCBjb21tdW5pdGllcyAoKktJVCo8c3VwPis8L3N1cD4pLCBhbmQgYWxsIG90aGVyCmNvbW11bml0aWVzLgoKYGBge3IgVmlzdWFsaXNhdGlvbjogVm9sY2FubyBNYXN0IGNhbGN1bGF0ZX0KCk1DLm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gc2NSTkFzZXFEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xID0gYygiQ0Q2OCtLSVQrIE1DIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjIgPSBjKCJDRDY4K0NBU1AxK0lMMUIrU0VMTCBNSW5mIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENjgrQ0QxQysgREMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q2OCtDRDQrIE1vbm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDY4K0lMMTgrVExSNCtUUkVNMisgTVJlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENjgrQUJDQTErT0xSMStUUkVNMisgRkMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRDIEkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRDIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgSUlJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgSVYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBWIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgVkkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRk9YUDMrIFRDIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMzQrIEVDIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzNCsgRUMgSUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBQ1RBMisgU01DIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDU2KyBOSyBJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENTYrIE5LIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAiQ0Q2OCtLSVQrIE1DIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q3OSsgQkNwbGFzbWEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q3OUErIEJDbWVtIikpCgpEVDo6ZGF0YXRhYmxlKE1DLm1hcmtlcnMpCmBgYAoKYGBge3IgVmlzdWFsaXNhdGlvbjogVm9sY2FubyBNYXN0LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpNQ19Wb2xjYW5vX1RhcmdldHNBID0gRW5oYW5jZWRWb2xjYW5vKE1DLm1hcmtlcnMsCiAgICBsYWIgPSByb3duYW1lcyhNQy5tYXJrZXJzKSwKICAgIHggPSAiYXZnX2xvZzJGQyIsCiAgICB5ID0gInBfdmFsX2FkaiIsCiAgICBzZWxlY3RMYWIgPSB0YXJnZXRfZ2VuZXNfcWMsCiAgICBheGlzTGFiU2l6ZSA9IDEyLAogICAgeGxhYiA9ICJhdmVyYWdlIGZvbGQtY2hhbmdlIiwKICAgIHRpdGxlID0gIk1hc3QgY2VsbCBtYXJrZXJzXG4oTWFzdCBjZWxsIGNvbW11bml0aWVzIHZzIHRoZSByZXN0KSIsCiAgICB0aXRsZUxhYlNpemUgPSAxNCwKICAgIHBDdXRvZmYgPSAwLjA1L25yb3coTUMubWFya2VycyksICMgMjA1NTIgZ2VuZXMKICAgIEZDY3V0b2ZmID0gMS4yNSwKICAgIHBvaW50U2l6ZSA9IDEuNSwKICAgIGxhYlNpemUgPSAzLjAsCiAgICBsZWdlbmRMYWJlbHMgPWMoJ05TJywnYXZnLiBmb2xkLWNoYW5nZScsJ1AnLAogICAgICAnUCAmIGF2Zy4gZm9sZC1jaGFuZ2UnKSwKICAgIGxlZ2VuZFBvc2l0aW9uID0gInJpZ2h0IiwKICAgIGxlZ2VuZExhYlNpemUgPSAxMCwKICAgIGxlZ2VuZEljb25TaXplID0gMy4wLAogICAgZHJhd0Nvbm5lY3RvcnMgPSBUUlVFLAogICAgd2lkdGhDb25uZWN0b3JzID0gMC4yLAogICAgY29sQ29ubmVjdG9ycyA9ICIjNTk1QTVDIiwKICAgIGdyaWRsaW5lcy5tYWpvciA9IEZBTFNFLAogICAgZ3JpZGxpbmVzLm1pbm9yID0gRkFMU0UpCk1DX1ZvbGNhbm9fVGFyZ2V0c0EKZ2dzYXZlKHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5Wb2xjYW5vLk1DLkRFRy5UYXJnZXRzLnBkZiIpLCAKICAgICAgIHBsb3QgPSBNQ19Wb2xjYW5vX1RhcmdldHNBKQpgYGAKClRoZSB0YXJnZXQgcmVzdWx0cyBhcmUgZ2l2ZW4gYmVsb3cgYW5kIHdyaXR0ZW4gdG8gYSBmaWxlLgoKYGBge3IgUmVzdWx0cyBNQ30KbGlicmFyeSh0aWJibGUpCk1DLm1hcmtlcnMgPC0gYWRkX2NvbHVtbihNQy5tYXJrZXJzLCBHZW5lID0gcm93Lm5hbWVzKE1DLm1hcmtlcnMpLCAuYmVmb3JlID0gMSkKCnRlbXAgPC0gTUMubWFya2Vyc1tNQy5tYXJrZXJzJEdlbmUgJWluJSB0YXJnZXRfZ2VuZXNfcWMsXQoKRFQ6OmRhdGF0YWJsZSh0ZW1wKQpgYGAKCmBgYHtyIFJlc3VsdHMgTUM6IHdyaXRpbmd9CmZ3cml0ZSh0ZW1wLCBmaWxlID0gcGFzdGUwKE9VVF9sb2MsICIvIiwgVG9kYXksICIuTUMuREVHLlRhcmdldHMudHh0IiksCiAgICAgICBxdW90ZSA9IEZBTFNFLAogICAgICAgc2VwID0gIlx0IiwgCiAgICAgICBzaG93UHJvZ3Jlc3MgPSBGQUxTRSwgdmVyYm9zZSA9IEZBTFNFKQpgYGAKCiMjIyMgTkstY2VsbHMKCkNvbXBhcmlzb24gYmV0d2VlbiB0aGUgbmF0dXJhbCBraWxsZXIgY2VsbCBjb21tdW5pdGllcyAoKk5DQU0xKjxzdXA+Kzwvc3VwPiksCmFuZCBhbGwgb3RoZXIgY29tbXVuaXRpZXMuCgpgYGB7ciBWaXN1YWxpc2F0aW9uOiBWb2xjYW5vIE5LIGNhbGN1bGF0ZX0KCk5LLm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gc2NSTkFzZXFEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xID0gYygiQ0QzK0NENTYrIE5LIEkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q1NisgTksgSUkiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMiA9IGMoIkNENjgrQ0FTUDErSUwxQitTRUxMIE1JbmYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q2OCtDRDFDKyBEQyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDY4K0NENCsgTW9ubyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENjgrSUwxOCtUTFI0K1RSRU0yKyBNUmVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q2OCtBQkNBMStPTFIxK1RSRU0yKyBGQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVEMgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBJSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBJViIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRDIFYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUQyBWSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGT1hQMysgVEMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzNCsgRUMgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDM0KyBFQyBJSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFDVEEyKyBTTUMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJDRDMrQ0Q1NisgTksgSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAiQ0QzK0NENTYrIE5LIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENjgrS0lUKyBNQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENzkrIEJDcGxhc21hIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENzlBKyBCQ21lbSIpKQoKRFQ6OmRhdGF0YWJsZShOSy5tYXJrZXJzKQpgYGAKCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gTkssIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Ck5LX1ZvbGNhbm9fVGFyZ2V0c0EgPSBFbmhhbmNlZFZvbGNhbm8oTksubWFya2VycywKICAgIGxhYiA9IHJvd25hbWVzKE5LLm1hcmtlcnMpLAogICAgeCA9ICJhdmdfbG9nMkZDIiwKICAgIHkgPSAicF92YWxfYWRqIiwKICAgIHNlbGVjdExhYiA9IHRhcmdldF9nZW5lc19xYywKICAgIGF4aXNMYWJTaXplID0gMTIsCiAgICB4bGFiID0gImF2ZXJhZ2UgZm9sZC1jaGFuZ2UiLAogICAgdGl0bGUgPSAiTksgbWFya2Vyc1xuKE5LLWNlbGwgY29tbXVuaXRpZXMgdnMgdGhlIHJlc3QpIiwKICAgIHRpdGxlTGFiU2l6ZSA9IDE0LAogICAgcEN1dG9mZiA9IDAuMDUvbnJvdyhOSy5tYXJrZXJzKSwgIyAyMDU1MiBnZW5lcwogICAgRkNjdXRvZmYgPSAxLjI1LAogICAgcG9pbnRTaXplID0gMS41LAogICAgbGFiU2l6ZSA9IDMuMCwKICAgIGxlZ2VuZExhYmVscyA9YygnTlMnLCdhdmcuIGZvbGQtY2hhbmdlJywnUCcsCiAgICAgICdQICYgYXZnLiBmb2xkLWNoYW5nZScpLAogICAgbGVnZW5kUG9zaXRpb24gPSAicmlnaHQiLAogICAgbGVnZW5kTGFiU2l6ZSA9IDEwLAogICAgbGVnZW5kSWNvblNpemUgPSAzLjAsCiAgICBkcmF3Q29ubmVjdG9ycyA9IFRSVUUsCiAgICB3aWR0aENvbm5lY3RvcnMgPSAwLjIsCiAgICBjb2xDb25uZWN0b3JzID0gIiM1OTVBNUMiLAogICAgZ3JpZGxpbmVzLm1ham9yID0gRkFMU0UsCiAgICBncmlkbGluZXMubWlub3IgPSBGQUxTRSkKTktfVm9sY2Fub19UYXJnZXRzQQpnZ3NhdmUocGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLlZvbGNhbm8uTksuREVHLlRhcmdldHMucGRmIiksIAogICAgICAgcGxvdCA9IE5LX1ZvbGNhbm9fVGFyZ2V0c0EpCmBgYAoKVGhlIHRhcmdldCByZXN1bHRzIGFyZSBnaXZlbiBiZWxvdyBhbmQgd3JpdHRlbiB0byBhIGZpbGUuCgpgYGB7ciBSZXN1bHRzIE5LfQpsaWJyYXJ5KHRpYmJsZSkKTksubWFya2VycyA8LSBhZGRfY29sdW1uKE5LLm1hcmtlcnMsIEdlbmUgPSByb3cubmFtZXMoTksubWFya2VycyksIC5iZWZvcmUgPSAxKQoKdGVtcCA8LSBOSy5tYXJrZXJzW05LLm1hcmtlcnMkR2VuZSAlaW4lIHRhcmdldF9nZW5lc19xYyxdCgpEVDo6ZGF0YXRhYmxlKHRlbXApCmBgYAoKYGBge3IgUmVzdWx0cyBOSzogd3JpdGluZ30KZndyaXRlKHRlbXAsIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLCBUb2RheSwgIi5OSy5ERUcuVGFyZ2V0cy50eHQiKSwKICAgICAgIHF1b3RlID0gRkFMU0UsCiAgICAgICBzZXAgPSAiXHQiLCAKICAgICAgIHNob3dQcm9ncmVzcyA9IEZBTFNFLCB2ZXJib3NlID0gRkFMU0UpCmBgYAoKIyBTdWJzZXQgc2NSTkFzZXEgZGF0YQoKTGlzdCBvZiBzYW1wbGVzIHRvIGJlIGluY2x1ZGVkIGJhc2VkIG9uIGluZm9ybWVkIGNvbnNlbnQgKHNlZSBhYm92ZSkuCgpgYGB7cn0Kc2FtcGxlc19vZl9pbnRlcmVzdCA8LSB1bmxpc3Qoc2NSTkFzZXFEYXRhTWV0YUFFLmFsbCRQYXRpZW50KQoKYGBgCgpgYGB7cn0Kc2NSTkFzZXFEYXRhQ0VBMzkgPC0gc3Vic2V0KHNjUk5Bc2VxRGF0YSwgc3Vic2V0ID0gUGF0aWVudCAlaW4lIHNhbXBsZXNfb2ZfaW50ZXJlc3QpCmBgYAoKYGBge3J9CnZhcmlhYmxlc19vZl9pbnRlcmVzdCA8LSBjKCJIb3NwaXRhbCIsICJPUnllYXIiLCAiQXJ0ZXJ5X3N1bW1hcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiQWdlIiwgIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJUQ19maW5hbCIsICJMRExfZmluYWwiLCAiSERMX2ZpbmFsIiwgIlRHX2ZpbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInN5c3RvbGljIiwgImRpYXN0b2xpIiwgIkdGUl9NRFJEIiwgIkJNSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJLRE9RSSIsICJCTUlfV0hPIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNtb2tlclN0YXR1cyIsICJBbGNvaG9sVXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpYWJldGVzU3RhdHVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkh5cGVydGVuc2lvbi5zZWxmcmVwb3J0IiwgIkh5cGVydGVuc2lvbi5zZWxmcmVwb3J0ZHJ1ZyIsICJIeXBlcnRlbnNpb24uY29tcG9zaXRlIiwgIkh5cGVydGVuc2lvbi5kcnVncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZWQuYW50aWNvYWd1bGFudHMiLCAiTWVkLmFsbC5hbnRpcGxhdGVsZXQiLCAiTWVkLlN0YXRpbi5MTEQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiU3Ryb2tlX0R4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInN5bXB0IiwgIlN5bXB0b21zLjVHIiwgIkFzeW1wdFN5bXB0IiwgIkFzeW1wdFN5bXB0MkciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiU3ltcHRvbXMuVXBkYXRlMkciLCAiU3ltcHRvbXMuVXBkYXRlM0ciLCAiaW5kZXhzeW1wdG9tc19sYXRlc3RfNGciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAicmVzdGVub3MiLCAic3Rlbm9zZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJDQURfaGlzdG9yeSIsICJQQU9EIiwgIlBlcmlwaGVyYWwuaW50ZXJ2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVQX2NvbXBvc2l0ZSIsICJFUF9jb21wb3NpdGVfdGltZSIsICJFUF9tYWpvciIsICJFUF9tYWpvcl90aW1lIikKCnRlbXAgPC0gc3Vic2V0KHNjUk5Bc2VxRGF0YU1ldGFBRS5hbGwsIHNlbGVjdCA9IGMoIlBhdGllbnQiLCB2YXJpYWJsZXNfb2ZfaW50ZXJlc3QpKQojIHN0cih0ZW1wKQoKYGBgCgpgYGB7cn0Kc2NSTkFzZXFEYXRhQ0VBMzlAbWV0YS5kYXRhIDwtIG1lcmdlKHNjUk5Bc2VxRGF0YUNFQTM5QG1ldGEuZGF0YSwgdGVtcCwgYnkueCA9ICJQYXRpZW50IiwgYnkueSA9ICJQYXRpZW50IikKc2NSTkFzZXFEYXRhQ0VBMzlAbWV0YS5kYXRhIDwtIGRwbHlyOjpyZW5hbWUoc2NSTkFzZXFEYXRhQ0VBMzlAbWV0YS5kYXRhLCAiU1RVRFlfTlVNQkVSIiA9ICJQYXRpZW50IikKCiMgc3RyKHNjUk5Bc2VxRGF0YUNFQTM5QG1ldGEuZGF0YSkKCmBgYAoKIyMgU2F2aW5nIG5ldyBkYXRhc2V0CgpgYGB7cn0KdGVtcDIgPC0gYXNfdGliYmxlKHN1YnNldChzY1JOQXNlcURhdGFDRUEzOUBtZXRhLmRhdGEsIHNlbGVjdCA9IGMoIlNUVURZX05VTUJFUiIsICJvcmlnLmlkZW50IiwgIm5Db3VudF9STkEiLCAibkZlYXR1cmVfUk5BIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxhdGUiLCAiQmF0Y2giLCAiQy5IIiwgIlR5cGUiLCAicGVyY2VudC5tdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5Db3VudF9TQ1QiLCAibkZlYXR1cmVfU0NUIiwgInNldXJhdF9jbHVzdGVycyIpKSkKCiMgZndyaXRlKHRlbXAyLAojICAgICAgICBmaWxlID0gcGFzdGUwKE9VVF9sb2MsICIvIiwgVG9kYXksICIuQUVTQ1JOQS5DRUEuMzlwdHMuc2FtcGxlbGlzdC5hZnRlcl9xYy5JQ19jb21tZXJjaWFsLmNzdiIpLAojICAgICAgICBzZXAgPSAiLCIsIHJvdy5uYW1lcyA9IEZBTFNFLCBjb2wubmFtZXMgPSBUUlVFLAojICAgICAgICBzaG93UHJvZ3Jlc3MgPSBUUlVFKQojIHJtKHRlbXAyKQojIAojIHRlbXAgPC0gZHBseXI6OnJlbmFtZSh0ZW1wLCAiU1RVRFlfTlVNQkVSIiA9ICJQYXRpZW50IikKIyBmd3JpdGUodGVtcCwKIyAgICAgICAgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsIFRvZGF5LCAiLkFFU0NSTkEuQ0VBLjM5cHRzLmNsaW5pY2FsZGF0YS5hZnRlcl9xYy5JQ19jb21tZXJjaWFsLmNzdiIpLAojICAgICAgICBzZXAgPSAiLCIsIHJvdy5uYW1lcyA9IEZBTFNFLCBjb2wubmFtZXMgPSBUUlVFLAojICAgICAgICBzaG93UHJvZ3Jlc3MgPSBUUlVFKQojIHJtKHRlbXApCiMgCiMgc2F2ZVJEUyhzY1JOQXNlcURhdGFDRUEzOSwgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsIFRvZGF5LCAiLkFFU0NSTkEuQ0VBLjM5cHRzLlNldXJhdC5hZnRlcl9xYy5JQ19jb21tZXJjaWFsLlJEUyIpKQoKZndyaXRlKHRlbXAyLAogICAgICAgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsIFRvZGF5LCAiLkFFU0NSTkEuQ0VBLjM5cHRzLnNhbXBsZWxpc3QuYWZ0ZXJfcWMuSUNfYWNhZGVtaWMuY3N2IiksCiAgICAgICBzZXAgPSAiLCIsIHJvdy5uYW1lcyA9IEZBTFNFLCBjb2wubmFtZXMgPSBUUlVFLAogICAgICAgc2hvd1Byb2dyZXNzID0gVFJVRSkKcm0odGVtcDIpCgp0ZW1wIDwtIGRwbHlyOjpyZW5hbWUodGVtcCwgIlNUVURZX05VTUJFUiIgPSAiUGF0aWVudCIpCmZ3cml0ZSh0ZW1wLAogICAgICAgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsIFRvZGF5LCAiLkFFU0NSTkEuQ0VBLjM5cHRzLmNsaW5pY2FsZGF0YS5hZnRlcl9xYy5JQ19hY2FkZW1pYy5jc3YiKSwKICAgICAgIHNlcCA9ICIsIiwgcm93Lm5hbWVzID0gRkFMU0UsIGNvbC5uYW1lcyA9IFRSVUUsCiAgICAgICBzaG93UHJvZ3Jlc3MgPSBUUlVFKQpybSh0ZW1wKQoKc2F2ZVJEUyhzY1JOQXNlcURhdGFDRUEzOSwgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsIFRvZGF5LCAiLkFFU0NSTkEuQ0VBLjM5cHRzLlNldXJhdC5hZnRlcl9xYy5JQ19hY2FkZW1pYy5SRFMiKSkKCmBgYAoKCiMgU2Vzc2lvbiBpbmZvcm1hdGlvbgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBWZXJzaW9uOiAgICAgIHYxLjAuMQogICAgTGFzdCB1cGRhdGU6ICAyMDIyLTAzLTE5CiAgICBXcml0dGVuIGJ5OiAgIFNhbmRlciBXLiB2YW4gZGVyIExhYW4gKHMudy52YW5kZXJsYWFuLTJbYXRddW1jdXRyZWNodC5ubCkuCiAgICBEZXNjcmlwdGlvbjogIFNjcmlwdCB0byBsb2FkIHNpbmdsZS1jZWxsIFJOQSBzZXF1ZW5jaW5nIChzY1JOQXNlcSkgZGF0YSwgYW5kIHBlcmZvcm0gcXVhbGl0eSBjb250cm9sIChRQyksIGFuZCBpbml0aWFsIG1hcHBpbmcgdG8gY2VsbHMuCiAgICBNaW5pbXVtIHJlcXVpcmVtZW50czogUiB2ZXJzaW9uIDMuNS4yICgyMDE4LTEyLTIwKSAtLSAnRWdnc2hlbGwgSWdsb28nLCBtYWNPUyBNb2phdmUgKDEwLjE0LjIpLgoKICAgICoqTW9TQ29XIFRvLURvIExpc3QqKgogICAgVGhlIHRoaW5ncyB3ZSBNdXN0LCBTaG91bGQsIENvdWxkLCBhbmQgV291bGQgaGF2ZSBnaXZlbiB0aGUgdGltZSB3ZSBoYXZlLgogICAgX01fCgogICAgX1NfCgogICAgX0NfCgogICAgX1dfCgogICAgKipDaGFuZ2VzIGxvZyoqCiAgICAqIHYxLjAuMSBVcGRhdGUgdG8gbWFpbiBBRURCICh0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgQWdlLXZhcmlhYmxlIGluIHRoZSBuZXcgdmVyc2lvbikuIEZld2VyIHBhdGllbnRzIGluIHNjUk5Bc2VxICgzMiB2cyAzOSB3aXRoIHRoZSBuZXdlciBkYXRhc2V0KS4KICAgICogdjEuMC4wIEluaXRpYWwgdmVyc2lvbi4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7ciBldmFsID0gVFJVRX0Kc2Vzc2lvbkluZm8oKQpgYGAKCiMgU2F2aW5nIGVudmlyb25tZW50CgpgYGB7ciBTYXZpbmd9CnJtKGJhY2t1cC5zY1JOQXNlcURhdGEpCnJtKHNjUk5Bc2VxRGF0YSwgc2NSTkFzZXFEYXRhQ0VBMzkpCgpzYXZlLmltYWdlKHBhc3RlMChQUk9KRUNUX2xvYywgIi8iLFRvZGF5LCIuIixQUk9KRUNUTkFNRSwiLkFFU0NSTkEucmVzdWx0cy5SRGF0YSIpKQoKYGBgCgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IDxzdXA+wqkgMTk3OS0yMDIyIFNhbmRlciBXLiB2YW4gZGVyIExhYW4gfCBzLncudmFuZGVybGFhblthdF1nbWFpbC5jb20gW3N3dmFuZGVybGFhbi5naXRodWIuaW9dKGh0dHBzOi8vc3d2YW5kZXJsYWFuLmdpdGh1Yi5pbykuPC9zdXA+IHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsK